// TODO: make it private and move all builder based methods here
public AssemblyBuilder Builder;
protected AssemblyBuilderExtension builder_extra;
- MonoSymbolWriter symbol_writer;
+ MonoSymbolFile symbol_writer;
bool is_cls_compliant;
bool wrap_non_exception_throws;
}
}
+ public MonoSymbolFile SymbolWriter {
+ get {
+ return symbol_writer;
+ }
+ }
+
#endregion
public void AddModule (ImportedModuleDefinition module)
}
if (Compiler.Settings.GenerateDebugInfo) {
- symbol_writer = new MonoSymbolWriter (file_name);
-
- // TODO: global variables
- SymbolWriter.symwriter = symbol_writer;
+ symbol_writer = new MonoSymbolFile ();
}
module.EmitContainer ();
public void Save ()
{
- PortableExecutableKinds pekind;
+ PortableExecutableKinds pekind = PortableExecutableKinds.ILOnly;
ImageFileMachine machine;
switch (Compiler.Settings.Platform) {
case Platform.X86:
- pekind = PortableExecutableKinds.Required32Bit | PortableExecutableKinds.ILOnly;
+ pekind |= PortableExecutableKinds.Required32Bit;
machine = ImageFileMachine.I386;
break;
case Platform.X64:
- pekind = PortableExecutableKinds.ILOnly;
+ pekind |= PortableExecutableKinds.PE32Plus;
machine = ImageFileMachine.AMD64;
break;
case Platform.IA64:
- pekind = PortableExecutableKinds.ILOnly;
machine = ImageFileMachine.IA64;
break;
+ case Platform.AnyCPU32Preferred:
+#if STATIC
+ pekind |= PortableExecutableKinds.Preferred32Bit;
+ machine = ImageFileMachine.I386;
+ break;
+#else
+ throw new NotSupportedException ();
+#endif
+ case Platform.Arm:
+#if STATIC
+ machine = ImageFileMachine.ARM;
+ break;
+#else
+ throw new NotSupportedException ();
+#endif
case Platform.AnyCPU:
default:
- pekind = PortableExecutableKinds.ILOnly;
machine = ImageFileMachine.I386;
break;
}
if (symbol_writer != null && Compiler.Report.Errors == 0) {
// TODO: it should run in parallel
Compiler.TimeReporter.Start (TimeReporter.TimerType.DebugSave);
- symbol_writer.WriteSymbolFile (SymbolWriter.GetGuid (module.Builder));
+
+ var filename = file_name + ".mdb";
+ try {
+ // We mmap the file, so unlink the previous version since it may be in use
+ File.Delete (filename);
+ } catch {
+ // We can safely ignore
+ }
+
+ module.WriteDebugSymbol (symbol_writer);
+
+ using (FileStream fs = new FileStream (filename, FileMode.Create, FileAccess.Write)) {
+ symbol_writer.CreateSymbolFile (module.Builder.ModuleVersionId, fs);
+ }
+
Compiler.TimeReporter.Stop (TimeReporter.TimerType.DebugSave);
}
}