[mdoc] Build with -platform:x86
authorJonathan Pryor <jonpryor@vt.edu>
Wed, 13 Mar 2013 00:03:53 +0000 (20:03 -0400)
committerJonathan Pryor <jonpryor@vt.edu>
Wed, 13 Mar 2013 00:07:40 +0000 (20:07 -0400)
Works around: http://connect.microsoft.com/VisualStudio/feedback/details/635365

The problem is that 64-bit .NET has a bug:
RuntimeHelpers.InitializeArray() throws ArgumentException for certain
array creation constructs that mcs likes to emit. Cecil uses
RuntimeHelpers.InitializeArray() to get the data, which throws, and
everyone becomes very sad:

Running mdoc "update" "--debug" ...
mdoc: System.TypeInitializationException: The type initializer for 'Mono.Cecil.Metadata.TableHeap' threw an exception. ---> System.ArgumentException: Value does not fall within the expected range.
   at System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray(Array array, RuntimeFieldHandle fldHandle)
   at Mono.Cecil.Metadata.TableHeap..cctor()
   --- End of inner exception stack trace ---
   at Mono.Cecil.Metadata.TableHeap..ctor(Section section, UInt32 start, UInt32 size)
   at Mono.Cecil.PE.ImageReader.ReadMetadataStream(Section section)
   at Mono.Cecil.PE.ImageReader.ReadMetadata()
   at Mono.Cecil.PE.ImageReader.ReadImage()
   at Mono.Cecil.PE.ImageReader.ReadImageFrom(Stream stream)
   at Mono.Cecil.ModuleDefinition.ReadModule(Stream stream, ReaderParameters parameters)
   at Mono.Cecil.ModuleDefinition.ReadModule(String fileName, ReaderParameters parameters)
   at Mono.Cecil.AssemblyDefinition.ReadAssembly(String fileName, ReaderParameters parameters)
   at Mono.Documentation.MDocUpdater.LoadAssembly(String name)
   at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Mono.Documentation.MDocUpdater.Run(IEnumerable`1 args)
   at Mono.Documentation.MDoc.Run(String[] args)
   at Mono.Documentation.MDoc.Main(String[] args)

The "fix" is to not use the 64-bit runtime, and instead explicitly
require the 32-bit runtime by using -platform:x86.

mcs/tools/mdoc/Makefile

index 97ff54e93f2c4cca56f77d2dec034a5e30dcb3a1..e4ff1eed87c55e50b568f54284249beb82ce885b 100644 (file)
@@ -61,6 +61,8 @@ EXTRA_DISTFILES = \
 
 $(PROGRAM) : $(MDOC_RESOURCES) $(MONODOC_RESOURCES) $(PROGRAM_DEPS)
 
+PROGRAM_COMPILE = $(CSCOMPILE) -platform:x86
+
 include ../../build/executable.make
 
 $(PROGRAM) : $(build_lib)