New in Mono 3.2.7

Release date: 24 Feb 2014

This is a major feature release that accumulates about 5 months of development

Highlights

5 months of work, 1235 commits by 65 contributors.

Initial support for the hardfp ABI on ARM. This enables mono to be used on more recent versions of linux and produce better code on those targets.

The ABCREM optimization received a lot of love, now it works much better on 64bits systems.

Two new optimizations were added, a Loop Invariant Code Motion pass and Alias Analysis are now available. Performance in some functions can improve as much as 20%.

Hardware fences and atomic operations got a large revamp together with support for dynamic feature detection.

64bits CAS instructions are now supported on 32bits systems. This resulted in a significant performance boost on PLINQ workloads with multiple core.

Our LLVM integration got some love. It can now generate fast TLS access, a more recent LLVM version is been used and the list of optimizations we let it perform has been updated.

Our GC received some micro-optimization love by some small optimization in internal data structures and the use of intrinsics to speed up some core loops.

System.Core now has an interpreter for LINQ expressions and dynamic statements that can be used by FullAOT runtimes.

Better support for custom task schedulers.

Significantly improved reachability and flow analysis in C# compiler.

New features

Runtime

  • [jit] Fix the handling of OP_ISUB_IMM in abcrem.
  • [jit] Improve ABCREM on 64-bits architectures
  • [jit] Implement the delegate ctor optimization in AOT mode too.
  • [jit] Some work towards a win64 port.
  • [jit] Use vectorized exception handling on windows.
  • [jit] Initial support for the hardfp ABI on ARM.
  • [jit] Add beginnings of a mach image writer for use with xdebug.
  • [jit] Implement proper TLS offset translation on mach based kernels.
  • [jit] Add a simple loop invariant loop motion pass for use with LLVM, which moves loop invariant instructions out of loop headers into the preceeding bblock.
  • [jit] Avoid linking the try block with the EH block as this produces spurious BBs during inlining.
  • [jit] The AggressiveInlining hint now triggers class initialization so more stuff gets force-inlined.
  • [jit] Add an alias analysis pass to the JIT.
  • [jit] ARM can dynamically switch between modes.
  • [jit] Atomics and hardware fences revamped and improved.
  • [jit] Add 64bits atomics on 32bits systems , this makes PLINQ significantly faster on multicore systems.
  • [llvm] Implement support for OP_TLS_GET_REG on osx/amd64.
  • [llvm] Update list of optimizations passed to ‘opt’.
  • [runtime] Scalability work: reduce usage of the loader lock
  • [runtime] Removed the old debugger from the runtime.
  • [runtime] socket-io: make it possible to specify an interface index as a MulticastInterface SocketOption on linux.
  • [runtime] Don’t expand variant generic interfaces on arrays.
  • [runtime] Implemented g_win32_getlocale function to return correct locale.
  • [runtime] Revamped hardware caps detection.
  • [runtime] Add LLDB support to mono_gdb_render_native_backtraces () on POSIX.
  • [runtime] Promote the reference queue API to the public.
  • [runtime] Provide more public API to inspect MonoTypes, MonoClasses and MonoMethodSignatures.
  • [runtime] Improving the retrieval of the user’s locale on Apple systems.
  • [runtime] Async stack walking with AOT
  • [sdb] Allow users to specify a suspension policy when enabling an event
  • [sdb] Add async variants to the InvokeMethod methods.
  • [sdb] Support a setpgid=y/n option to –debugger-agent.
  • [sdb] Emit better debugger attribute for stepping over state machine initialization
  • [sgen] Reverse the free-list after sweeping to be in address-order.
  • [sgen] Only enqueue LOS objects if they contain references.
  • [sgen] Use gcc bitcount intrinsics where appropriate.

Class libraries

  • [corlib] Implementation of System.Reflection.ParameterInfo.HasDefaultValue
  • [corlib] Implemented System.Threading.Monitor.IsEntered
  • [corlib] LogicalSet/GetData implementation in CallContext
  • [corlib] Implement CultureInfo.DefaultThreadCurrentUICulture.
  • [corlib] Implement CultureInfo.DefaultThreadCurrentCulture.
  • [corlib] Add ‘System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken’ stub.
  • [Mono.Options] Improve error message for badly bundled args.
  • [pcl] Add new ‘System.Runtime.InteropServices.WindowsRuntime’ Facade Assembly.
  • [rx] Updated Rx to 2.2 release.
  • [System] Add IsIPv6Teredo to System.Net.IpAddress
  • [System] Add more of System.ComponentModel to MOBILE profile.
  • [System.Core] Update MonoTouch System.Linq.Expression to be 4.5 compatible
  • [System.Core] Add dynamic interpreter
  • [System.Core] Support IReadOnlyList in System.Linq.Enumerable.ElementAt and ElementAtOrDefault
  • [classlib] Introduce the mobile_static build.
  • [classlib] Add OrderedDictionary to the mobile profile.

Tools

  • [mcs] Suport recursive references of non-FX assemblies
  • [mcs] Implements definite assignment of expressions
  • [linker] Allow overriding MarkCustomAttribute and expose the MarkDefaultConstructor feature to subclasses
  • [xbuild] Initial MSBuild 12.0 support.
  • [xbuild] Improved xbuild diagnostics.
  • [xbuild] implement “skip target due to previous success” feature.
  • [xbuild] Add xbuild support for BuildManager

Bug fixes

  • [Microsoft.Build.Engine] Fix the escaping/unescaping of FullPath metadata
  • Properly compare assembly versions when performing binding. Fixes #17368.
  • [sdb] Fix setting of byref variables in registers. Fixes #17185.
  • [System.Net.Http] Add parsing of multi-value strings. Fixes #17132
  • [io-layer] Properly check write permission of a file. Fixes #3501.
  • Don’t raise an exception if we can’t find the src assembly on a shadow copy appdomain
  • [corlib] Update en-GB first day of week. Fixes #17151
  • [mcs] Check type of index used in pointer array aritmetic. Fixes #17145
  • [runtime] Fix large file support on android, it doesn’t support -D_FILE_OFFSET_BITS=64, so call lseek64 directly. Fixes #17128.
  • fix bug #11335.
  • Fix bug #11336.
  • [io-layer] Correctly implement permission checking for File.Move. Fixes #17009.
  • The old check was simply for open sharing status, which is incorrect. The right
  • thing to do is to check for FileShare.Delete and not FileAccess.
  • [jit] Fix some checks in the arm dyn call code. Fixes #17101.
  • BXC14584 - Console windows pop up during build with mono runtime
  • [PCL] Add ReadOnlyDictionary type-forwarder for XI. Fixes #16951.
  • [corlib] Mark all promise-style task exceptions observed. Fixes #17015
  • [mcs] Emit Debuggable attribute. Fixes #16924
  • [mcs] Method group caching needs to consider type arguments as well. Fixes #17059
  • [jit] Save/restore all-callee saved registers in methods using some atomic opcodes on x86, since the opcode implementations use these registers, and the push/pop code used by these opcodes is not async safe, since the unwind code doesn’t know about it. Fixes part of #16808.
  • [runtime] Fix yet another metadata problem with dynamically created types. Fixes #14977.
  • [jit] Emit calls to class init trampolines for fields accesses inside inline methods in AOT mode. Fixes #16461.
  • [runtime] Avoid RuntimeHelpers.EnsureSufficientExecutionStack () failing on windows. Works around #16776.
  • [runtime] Call mono_class_setup_methods () before accessing klass->method.count. Fixes #16883.
  • [corlib] Update datetime patters. Fixes #17044
  • [mcs] Better check for value type base call. Fixes #16806
  • [mcs] Await flow analysis uses resolved expression. Fixes #16840
  • [gsharedvt] Avoid using the variable size code paths for non-variable size types with some array opcodes. Fixes #17023.
  • [jit] Avoid nullifying class init trampolines for recursive calls to class initializers. Fixes #16489
  • [WindowsBase] Implement GroupDescription based on moonlight implementation
  • Remove usage of mini_replace_type () from mono_jit_runtime_invoke (), runtime invokes care about the precise types of parameters. Fixes #16830.
  • [aot] Sanitize utf8 characters in symbol names. Fixes #16851.
  • Fix for PkgConfig cache orphaned entries bug (xam bug #11133)
  • [mcs] Don’t wrap reference type values in explicit nullable conversion. Fixes #16900
  • [mcs] Restore async modifiers context after nested enums declaration. Fixes #16997
  • [corlib] Promise style tasks cannot be started manually. Fixes #16857
  • [corlib] Thread.GetNamedDataSlot allocates slot on failure. Fixes #16788
  • Use LIFO policy for CancellationTokenSource Fixes #16992
  • Fix CancellationTokenSourceTest.ReEntrantRegistrationTest
  • Make tuple hash function consistent with the F# implementation
  • Don’t call CFNetworkCopyProxiesForAutoConfigurationScript from more than one thread. Fixes #7923, comment 21.
  • Check for null item in BindingList<T>.InsertItem. Fixes #16902
  • Do not assume the first certificate of a PKCS12 file is the one matching the key (even if it’s the most common way).
  • [System] Change S.N.S.NetworkStream’s param name on ctor #16832
  • [System] When starting a process with UseShellExecute=true, don’t return a process. Fixes #16119
  • [io-layer] On OSX don’t pass -W to open as we don’t care for it waiting.
  • [runtime] A thread without a domain set cannot be running managed code. Fixes #16794.
  • [aot] Give the compilation unit entries in the DWARF debug info different names, the osx tools seem to need this (#15202).
  • [aot] Add runtime wrappers for methods of generic classes and generic methods. Fixes #16747.
  • [gsharedvt] Add a wrapper to the mono_gsharedvt_constrained_call () icall, since it calls mono_runtime_invoke () which can throw exceptions. Fixes #16439.
  • [jit] Fix TLS+AOT support in the monitor enter/exit trampolines.
  • [jit] Fix memory leaks in get_gsharedvt_type (). Fixes #16787.
  • [corlib] Mark ConcurrentDictionary serializable. Fixes #16730
  • [bcl] When finalizing a Process object, don’t touch the streams as they are finalized on their own. Fixes #10883.
  • [mcs] Clone labeled statements cache in probing mode. Fixes #16376
  • [jit]Emit explicit float rounding on amd64. Fixes #15987
  • [mcs] Update populated member cache of dynamic containers manually for additional entries. Fixes #16659
  • [mcs] Show correct #line location for files in other than current location referenced as relative files. Fixes #16576
  • [system] Redirect of put requests was converted to get. Fixes #16670
  • [corlib] Multiple fixes to TPL.
  • [Bug 14664] LogicalSet/GetData implementation in CallContext
  • [sgen]Fix a deadlock when the GC try to free a JI during world restart. Fixes #15759
  • [bcl] Invoke assembly resolve hooks even if the assembly name has a parse error. Fixes #16487.
  • [corlib] Optimize one string Join<T> overload. Fixes #16647
  • [bcl] Handle BigInt -> long conversions that should overflow but dont. Fixes #16526
  • [System.Net.Http] Don’t throw on invalid input in TryGetValues. Fixes #16634
  • [mcs] Don’t stop type inference when a unique construction of the generic interface cannot be found. Fixes #16567
  • [mcs] Add better type conversion to unary mutators. Fixes #16578
  • [corlib] Implement task awaiters running on custom task scheduler. Fixes #16587
  • [corlib] Better conversion betwen system locale and CultureInfo. Fixes #15875
  • [xbuild] Check a <Target>’s “Returns” first, then fall-back to “Outputs”.
  • [xbuild] Allow expressions inside a dynamic <ItemGroup>’s metadata. Fixes #14661.
  • [sgen] Never invoke libc’s memmove() or bzero(). Fixes #16449
  • [mcs] Report nice error instead of crash for cyclic type forwarders. Fixes #16385
  • [mcs] Report all failure errors in lambda conversions. Fixes #16513
  • [xbuild] Implement task batching for properties; fixes #16403.
  • [linq] Enumerable.Join and GroupJoin needs to ignore null keys. Fixes #16530
  • [corlib] DebuggerTypeProxyAttribute.ProxyName needs to return an assembly qualified type name. Fixes #16527
  • [jit] Implement double->uintptr conversions on 64 bit platforms. Fixes #16529.
  • [sdb] Fix step-over with recursive functions. Fixes #5700.
  • [corlib] Consider all unicode separators in ToTitleCase. Fixes #16365
  • [corlib] Set initialized List<T> capacity to match input enumeration. Fixes #16318
  • [mcs] Report ambiguity in attribute types in expanded mode. Fixes #16342
  • [mcs] Emit this initializer for structs. Fixes #16430
  • [sgen] Implement our own qsort() so as not do deadlock. #16432
  • [mcs] Dynamically calculate size of flow-analysis bitset. Fixes #4210
  • [Bug 16334] Fix ConcurrentBag.TryTake and TryPeek
  • [Bug 16267] SemaphoreSlim.Wait fix when no timeout
  • [runtime] Avoid caching member_ref tokens of dynamic images. Fixes #16096
  • Fix the `nop` opcode on some MIPS-based Loongson CPUs. https://sourceware.org/ml/binutils/2009-11/msg00387.html
  • [Bug 16186] SqlCommand.BeginExecuteInternal fix
  • [sdb] Add an ExitCode property to VMDeathEvent. Fixes #16113.
  • [aot] Increase a buffer size to avoid an assert. Fixes #16239.
  • [runtime]Type parsing of generics should not rely on the presence of a backtick. Fixes #15124.
  • [mcs] Assignment to value type readonly generated variables needs to check all member access expressions. Fixes #15832
  • [mcs] Missing type forwarded types should not cause type collision. Fixes #16196
  • [linker] Do not import something that is not marked when sweeping type references (otherwise we might re-intoduce dependencies we’re not including or need) [#16213]
  • Always show error message when type resolver produces ambiguous type. Fixes #16115
  • Setting ReceiveBufferSize & SendBufferSize on Socket (Bug 16021 & Bug 12754)
  • [sle] Enable char equality comparison. Fixes #15582
  • Update currency separators. Fixes #15425
  • Extract CurrencyDecimalDigits using currency and not territory info. Fixes #15895
  • [jit] Use unsigned comparisons with the IMT thunks as they can live in high memory addresses.
  • Task.WhenAllCore<T> now handles empty argument list correctly. Fixes #15956
  • TimeZone.GetUtcOffset should use Standard UTC offsets for the period when daylight savings ends.
  • [runtime] Preserve the call chain in mono_arch_setup_async_callback () on amd64 to prevent crashes in the libgcc unwinder (#15969).
  • Return empty result array when calling Task.WhenAllCore<T> with empty argument list. Fixes #15956
  • [runtime] Fix stack size detection on osx mavericks. Fixes #15890.
  • [runtime]Split thread unregistration in two steps, one with no locks, one with locks taken. Fixes #15916.
  • [runtime] Handle unaligned access in all interlocked icalls. Fixes #15925.
  • [sdb] Implement support for DebuggerStepThrough attribute. Fixes #15139.
  • [System] Avoid an NRE when Close() and Write() are concurrent. #15857
  • [sdb] Fix an assertion if a single step breakpoint is hit in a thread other than the thread the single stepping is done on. Fixes #14950.
  • [Mono.Debugger.Soft] Implemented inheritance for TypeMirror.GetCustomAttributes() Fixes bug #15320
  • [runtime] Fix an assertion in mono_arch_context_get_int_reg () on amd64. Fixes #15786.
  • When parsing documentation cref text turn on error probing for tokenizer as well. Fixes #15511
  • Better error message when member does not implement interface. Fixes #15369
  • Variables from diffent parameter block still need to be captures even if async block has no await. Fixes #15719
  • The stripper does not care if some variables can’t be referenced (they’ll be removed) and new cecil has a similar fix [#15727]
  • Update lower/upper type inference fixing to match the latest C# standard. Fixes #15505
  • Enum subtraction quirk needs to work with numeric constants only. Fixes #15520
  • When looking for base implementation of generic MVAR methods use non-inflated parameter types. Fixes #15523
  • [sdb] Add an IncludeSubclasses property to ExceptionEventRequest, to control whenever to include subclasses of the exception type. Fixes #15541
  • Fix condition (for MOBILE) that excluded System.Xml.Schema/Extensions.cs. Removed the condition since every profile we now support includes this [#15552]
  • Fill out AssemblyName.ProcessorArchitecture for assemblies. Fixes #15347.
  • Better check for open generic types in probing expression. Fixes #15422
  • Fixes too early optimization of binary &&/& bool constants. Fixes part of #15392
  • [sgen] Don’t crash on nurseries of 512M or larger.
  • [aot] Only use an AOT shortcut in the trampoline code if its safe to do so. Fixes #15345.
  • [xdebug] Avoid using a MonoDebugMethodJitInfo structure after it has been freed. Fixes #15090.
  • bxc#13642: MacNetworkChange: implement using managed code
  • Compound assignment of optimized binary constant needs to decompose it first. Fixes #15315
  • Ensure that CodeDom generated temporary directory is always created. Fixes #12202
  • Process/compare/output method’s generic parameters [#15311]
  • Enum IConvertible can convert to same enum or System.Enum. Fixes #15289
  • Release continuation ancestor before running. Fixes #15036
  • Adds async type inference of void return type. Fixes #15238
  • Make Task.Delay more reliable. Fixes #14585
  • Fallback to $LANG if $LC_ALL isn’t set. 15214
  • Cache only resolved types not expression to report correct error location. Fixes #15035
  • Better check for instance equality of generic types. Fixes #15100
  • Support deserializing relative Uris. Fixes #15169.
  • Relax name check when deserializing a WindowsIdentity instance as the name can be empty (e.g. iOS7 simulator will hide the user name) [#12789]
  • Anonymous method with this access inside an iterator needs to initialize captured this field from iterator’s copy. Fixes #14926
  • [sdb] Fix decoding of nested structs. Fixes #14942.
  • there was another escape sequence 1B 24 40 to indicate “old” JIS. Fix bug #14951
  • Don’t crash when reporting invalid named argument name. Fixes #14962
  • [MSBuild] Fix the ${level} and ${number} capture. Fixes: https://bugzilla.xamarin.com/show_bug.cgi?id=14767
  • Better checks for inaccessible member used via dynamic proxy. Fixes #14762
  • Initialize cookie container for default requests. Fixes #14783
  • Check modifying members of readonly value-type field. Fixes #14802
  • Make sure we properly account for transitive liveness when processing bridge objects. Fixes #13858
  • Implements content loading cancellation. Fixes #13200
  • Fixed TaskFactory::ContinueWhenAny with func result. Fixes #14839
  • [sgen] Use __builtin_ctzl () in OBJ_BITMAP_FOREACH_PTR () on 64 bit platforms. Fixes #14834.
  • AggregateException::GetBaseException uses only 1-based inner exceptions. Fixes #14824
  • [FIX] Bug 267: wsdl fails with “Argument is out of range.”
  • [System.Web] Do not crash on duplicate keys in browser capabilities #14720 #13014
  • [System.Net] Fix CFNetworkCopyProxiesForAutoConfigurationScript signature. Fixes #7923.
  • [runtime] Fix a bug in the local register allocator when an fp vreg wasn’t clobbered by a call if its href happened to be equal to the hreg of the call instruction. Fixes #12510.
  • Fix: bug https://bugzilla.xamarin.com/show_bug.cgi?id=14811 (to be reviewed)
  • [sdb] Add an implicit seq point after every nonvoid call and make step over skip them. Fixes #10782.
  • [runtime] Make mono_install_handler_block_guard () async-safe. Fixes #14073.
  • Don’t crash when unreachable code contains unreachable constant switch. Fixes #14587
  • Unify Array/List FindIndex/FindLastIndex handling and argument checking. Fixes #14632
  • [bcl] Fix BlockingCollection.TakeFromAny to handle when no items are available on the first collection. Fixes #6095.
  • Fix Bug 4811, xbuild should find xml documentation
  • [jit] Make ABCREM really remove bounds checks, not just when running with -v -v -v -v.
  • [llvm] Use i64*/i32* as the LLVM type of objrefs instead of i64/i32, the basicaa LLVM pass cannot see through the inttoptr casts we were emitting before loads.
  • [llvm] Make some types more precise to decrease the number of int<->ptr conversions generated.