Skip to content

Commit ddc26b2

Browse files
committed
Introduce ISymbolWriter.Write
This mostly cleans up the code to make it easier to understand. `ISymbolWriter.GetDebugHeader` no longer actually writes the symbols, there's a new `Write` method for just that. The assembly writer calls `Write` first and then the image writer calls `GetDebugHeader` when it's needed. This is partially taken from jbevain#617.
1 parent d02d7b3 commit ddc26b2

File tree

7 files changed

+61
-24
lines changed

7 files changed

+61
-24
lines changed

Mono.Cecil.Cil/PortablePdb.cs

+14-2
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,10 @@ public void Write (MethodDebugInformation info)
305305
pdb_metadata.AddMethodDebugInformation (info);
306306
}
307307

308-
public ImageDebugHeader GetDebugHeader ()
308+
public void Write ()
309309
{
310310
if (IsEmbedded)
311-
return new ImageDebugHeader ();
311+
return;
312312

313313
WritePdbFile ();
314314

@@ -317,6 +317,12 @@ public ImageDebugHeader GetDebugHeader ()
317317
var buffer = new byte [8192];
318318
CryptoService.CopyStreamChunk (writer.BaseStream, final_stream.value, buffer, (int)writer.BaseStream.Length);
319319
}
320+
}
321+
322+
public ImageDebugHeader GetDebugHeader ()
323+
{
324+
if (IsEmbedded)
325+
return new ImageDebugHeader ();
320326

321327
ImageDebugHeaderEntry codeViewEntry;
322328
{
@@ -548,8 +554,14 @@ public ImageDebugHeader GetDebugHeader ()
548554
return new ImageDebugHeader (debugHeaderEntries);
549555
}
550556

557+
public void Write ()
558+
{
559+
writer.Write ();
560+
}
561+
551562
public void Dispose ()
552563
{
564+
writer.Dispose ();
553565
}
554566
}
555567

Mono.Cecil.Cil/Symbols.cs

+1
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,7 @@ public interface ISymbolWriter : IDisposable {
11151115
ISymbolReaderProvider GetReaderProvider ();
11161116
ImageDebugHeader GetDebugHeader ();
11171117
void Write (MethodDebugInformation info);
1118+
void Write ();
11181119
}
11191120

11201121
public interface ISymbolWriterProvider {

Mono.Cecil.PE/ImageWriter.cs

+17-9
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ sealed class ImageWriter : BinaryStreamWriter {
5050

5151
internal long debug_header_entries_position;
5252

53-
ImageWriter (ModuleDefinition module, string runtime_version, MetadataBuilder metadata, Disposable<Stream> stream, bool metadataOnly = false, ImageDebugHeader debugHeader = null)
53+
ImageWriter (ModuleDefinition module, string runtime_version, MetadataBuilder metadata, Disposable<Stream> stream, bool metadataOnly = false)
5454
: base (stream.value)
5555
{
5656
this.module = module;
@@ -63,18 +63,26 @@ sealed class ImageWriter : BinaryStreamWriter {
6363

6464
this.pe64 = module.Architecture == TargetArchitecture.AMD64 || module.Architecture == TargetArchitecture.IA64 || module.Architecture == TargetArchitecture.ARM64;
6565
this.has_reloc = module.Architecture == TargetArchitecture.I386;
66+
this.GetDebugHeader ();
6667
this.GetWin32Resources ();
68+
this.BuildTextMap ();
69+
this.sections = (ushort)(has_reloc ? 2 : 1); // text + reloc?
70+
}
71+
72+
void GetDebugHeader ()
73+
{
74+
var symbol_writer = metadata.symbol_writer;
75+
if (symbol_writer != null)
76+
debug_header = symbol_writer.GetDebugHeader ();
6777

68-
debug_header = debugHeader;
6978
if (module.HasDebugHeader) {
7079
var header = module.GetDebugHeader ();
7180
var deterministic = header.GetDeterministicEntry ();
72-
if (deterministic != null)
73-
debug_header = debug_header.AddDeterministicEntry ();
74-
}
81+
if (deterministic == null)
82+
return;
7583

76-
this.BuildTextMap ();
77-
this.sections = (ushort)(has_reloc ? 2 : 1); // text + reloc?
84+
debug_header = debug_header.AddDeterministicEntry ();
85+
}
7886
}
7987

8088
void GetWin32Resources ()
@@ -90,9 +98,9 @@ void GetWin32Resources ()
9098
}
9199
}
92100

93-
public static ImageWriter CreateWriter (ModuleDefinition module, MetadataBuilder metadata, Disposable<Stream> stream, ImageDebugHeader debugHeader)
101+
public static ImageWriter CreateWriter (ModuleDefinition module, MetadataBuilder metadata, Disposable<Stream> stream)
94102
{
95-
var writer = new ImageWriter (module, module.runtime_version, metadata, stream, metadataOnly: false, debugHeader: debugHeader);
103+
var writer = new ImageWriter (module, module.runtime_version, metadata, stream, metadataOnly: false);
96104
writer.BuildSections ();
97105
return writer;
98106
}

Mono.Cecil/AssemblyWriter.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,10 @@ static void Write (ModuleDefinition module, Disposable<Stream> stream, WriterPar
118118
metadata.SetSymbolWriter (symbol_writer);
119119
BuildMetadata (module, metadata);
120120

121-
ImageDebugHeader debugHeader = null;
122121
if (symbol_writer != null)
123-
debugHeader = symbol_writer.GetDebugHeader ();
122+
symbol_writer.Write ();
124123

125-
var writer = ImageWriter.CreateWriter (module, metadata, stream, debugHeader);
124+
var writer = ImageWriter.CreateWriter (module, metadata, stream);
126125
stream.value.SetLength (0);
127126
writer.WriteImage ();
128127

Test/Mono.Cecil.Tests/PortablePdbTests.cs

+5
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,11 @@ public void Write (MethodDebugInformation info)
708708
symbol_writer.Write (info);
709709
}
710710

711+
public void Write ()
712+
{
713+
symbol_writer.Write ();
714+
}
715+
711716
public void Dispose ()
712717
{
713718
symbol_writer.Dispose ();

symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs

+6
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ public ImageDebugHeader GetDebugHeader ()
167167
return new ImageDebugHeader ();
168168
}
169169

170+
public void Write ()
171+
{
172+
// Can't write it here since we need the final module MVID - which is only computed
173+
// after the entire image of the assembly is written (since it's computed from the hash of that)
174+
}
175+
170176
public void Dispose ()
171177
{
172178
writer.WriteSymbolFile (module.Mvid);

symbols/pdb/Mono.Cecil.Pdb/NativePdbWriter.cs

+16-10
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public class NativePdbWriter : ISymbolWriter {
2828
readonly Dictionary<string, SymDocumentWriter> documents;
2929
readonly Dictionary<ImportDebugInformation, MetadataToken> import_info_to_parent;
3030

31+
ImageDebugDirectory debug_directory;
32+
byte [] debug_info;
33+
3134
internal NativePdbWriter (ModuleDefinition module, SymWriter writer)
3235
{
3336
this.module = module;
@@ -44,16 +47,7 @@ public ISymbolReaderProvider GetReaderProvider ()
4447

4548
public ImageDebugHeader GetDebugHeader ()
4649
{
47-
var entry_point = module.EntryPoint;
48-
if (entry_point != null)
49-
writer.SetUserEntryPoint (entry_point.MetadataToken.ToInt32 ());
50-
51-
ImageDebugDirectory directory;
52-
var data = writer.GetDebugInfo (out directory);
53-
directory.TimeDateStamp = (int) module.timestamp;
54-
55-
writer.Close ();
56-
return new ImageDebugHeader (new ImageDebugHeaderEntry (directory, data));
50+
return new ImageDebugHeader (new ImageDebugHeaderEntry (debug_directory, debug_info));
5751
}
5852

5953
public void Write (MethodDebugInformation info)
@@ -259,6 +253,18 @@ SymDocumentWriter GetDocument (Document document)
259253
return doc_writer;
260254
}
261255

256+
public void Write ()
257+
{
258+
var entry_point = module.EntryPoint;
259+
if (entry_point != null)
260+
writer.SetUserEntryPoint (entry_point.MetadataToken.ToInt32 ());
261+
262+
debug_info = writer.GetDebugInfo (out debug_directory);
263+
debug_directory.TimeDateStamp = (int)module.timestamp;
264+
265+
writer.Close ();
266+
}
267+
262268
public void Dispose ()
263269
{
264270
}

0 commit comments

Comments
 (0)