Skip to content

Commit 61b6e0b

Browse files
committed
Add ISymUnmanagedReader5 and ISymUnmanagedEncUpdate
1 parent 3b17da3 commit 61b6e0b

6 files changed

Lines changed: 365 additions & 3 deletions

File tree

src/Microsoft.DiaSymReader/Shared/Extensions/SymUnmanagedExtensions.Reader.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ public static int GetUserEntryPoint(this ISymUnmanagedReader reader)
7676
return entryPoint;
7777
}
7878

79+
public static ISymUnmanagedDocument GetDocument(this ISymUnmanagedReader reader, string name)
80+
{
81+
if (reader == null)
82+
{
83+
throw new ArgumentNullException(nameof(reader));
84+
}
85+
86+
ISymUnmanagedDocument document;
87+
ThrowExceptionForHR(reader.GetDocument(name, default(Guid), default(Guid), default(Guid), out document));
88+
return document;
89+
}
90+
7991
public static ISymUnmanagedDocument[] GetDocuments(this ISymUnmanagedReader reader)
8092
{
8193
if (reader == null)
@@ -100,7 +112,27 @@ public static ISymUnmanagedMethod[] GetMethodsInDocument(this ISymUnmanagedReade
100112

101113
public static ISymUnmanagedMethod GetMethod(this ISymUnmanagedReader reader, int methodToken)
102114
{
103-
return GetMethodByVersion(reader, methodToken, methodVersion: 1);
115+
if (reader == null)
116+
{
117+
throw new ArgumentNullException(nameof(reader));
118+
}
119+
120+
ISymUnmanagedMethod method;
121+
int hr = reader.GetMethod(methodToken, out method);
122+
ThrowExceptionForHR(hr);
123+
124+
if (hr < 0)
125+
{
126+
// method has no symbol info
127+
return null;
128+
}
129+
130+
if (method == null)
131+
{
132+
throw new InvalidOperationException();
133+
}
134+
135+
return method;
104136
}
105137

106138
public static ISymUnmanagedMethod GetMethodByVersion(this ISymUnmanagedReader reader, int methodToken, int methodVersion)
@@ -110,7 +142,7 @@ public static ISymUnmanagedMethod GetMethodByVersion(this ISymUnmanagedReader re
110142
throw new ArgumentNullException(nameof(reader));
111143
}
112144

113-
ISymUnmanagedMethod method = null;
145+
ISymUnmanagedMethod method;
114146
int hr = reader.GetMethodByVersion(methodToken, methodVersion, out method);
115147
ThrowExceptionForHR(hr);
116148

@@ -127,5 +159,17 @@ public static ISymUnmanagedMethod GetMethodByVersion(this ISymUnmanagedReader re
127159

128160
return method;
129161
}
162+
163+
public static int GetMethodVersion(this ISymUnmanagedReader reader, ISymUnmanagedMethod method)
164+
{
165+
if (reader == null)
166+
{
167+
throw new ArgumentNullException(nameof(reader));
168+
}
169+
170+
int version;
171+
ThrowExceptionForHR(reader.GetMethodVersion(method, out version));
172+
return version;
173+
}
130174
}
131175
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
using System;
4+
using System.Runtime.InteropServices;
5+
using System.Runtime.InteropServices.ComTypes;
6+
7+
namespace Microsoft.DiaSymReader
8+
{
9+
[ComImport]
10+
[Guid("E502D2DD-8671-4338-8F2A-FC08229628C4")]
11+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
12+
[ComVisible(false)]
13+
public interface ISymUnmanagedEncUpdate
14+
{
15+
/// <summary>
16+
/// Applies EnC edit.
17+
/// </summary>
18+
[PreserveSig]
19+
int UpdateSymbolStore2(
20+
IStream stream,
21+
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]SymUnmanagedLineDelta[] lineDeltas,
22+
int lineDeltaCount);
23+
24+
/// <summary>
25+
/// Gets the number of local variables of the latest version of the specified method.
26+
/// </summary>
27+
[PreserveSig]
28+
int GetLocalVariableCount(int methodToken, out int count);
29+
30+
/// <summary>
31+
/// Gets local variables of the latest version of the specified method.
32+
/// </summary>
33+
[PreserveSig]
34+
int GetLocalVariables(
35+
int methodToken,
36+
int bufferLength,
37+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] variables,
38+
out int count);
39+
40+
[PreserveSig]
41+
int InitializeForEnc();
42+
43+
/// <summary>
44+
/// Allows updating the line info for a method that has not been recompiled,
45+
/// but whose lines have moved independently. A delta for each statement is allowed.
46+
/// </summary>
47+
[PreserveSig]
48+
int UpdateMethodLines(
49+
int methodToken,
50+
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] int[] deltas,
51+
int count);
52+
}
53+
}

src/Microsoft.DiaSymReader/Shared/ISymUnmanagedReader4.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ public interface ISymUnmanagedReader4 : ISymUnmanagedReader3
185185
unsafe int GetPortableDebugMetadata(out byte* metadata, out int size);
186186

187187
/// <summary>
188-
/// Returns a pointer to Source Server data stored in the PDB.
188+
/// Returns a pointer to Source Server data stored in the PDB (source link data for Portable PDB or srcsvr section for Windows PDB).
189189
/// </summary>
190190
/// <param name="data">
191191
/// A pointer to memory where Source Server data start. The memory is owned by the SymReader and
@@ -194,6 +194,13 @@ public interface ISymUnmanagedReader4 : ISymUnmanagedReader3
194194
/// Null if the PDB doesn't contain Source Server data.
195195
/// </param>
196196
/// <param name="size">Size of the data in bytes.</param>
197+
/// <remarks>
198+
/// This method is a replacement for <see cref="M:ISymUnmanagedSourceServerModule.GetSourceServerData"/>.
199+
/// The reader doesn't implement <see cref="M:ISymUnmanagedSourceServerModule.GetSourceServerData"/> since
200+
/// the format of the returned data is completely different for Portable PDBs, which the callers wouldn't expect.
201+
/// The native diasymreader may implement <see cref="GetSourceServerData(out byte*, out int)"/> by simply calling
202+
/// to <see cref="M:ISymUnmanagedSourceServerModule.GetSourceServerData"/>.
203+
/// </remarks>
197204
[PreserveSig]
198205
unsafe int GetSourceServerData(out byte* data, out int size);
199206

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
using System;
4+
using System.Runtime.InteropServices;
5+
using System.Runtime.InteropServices.ComTypes;
6+
7+
namespace Microsoft.DiaSymReader
8+
{
9+
[ComImport]
10+
[Guid("6576c987-7e8d-4298-a6e1-6f9783165f07")]
11+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
12+
[ComVisible(false)]
13+
public interface ISymUnmanagedReader5 : ISymUnmanagedReader4
14+
{
15+
#region ISymUnmanagedReader methods
16+
17+
[PreserveSig]
18+
new int GetDocument(
19+
[MarshalAs(UnmanagedType.LPWStr)] string url,
20+
Guid language,
21+
Guid languageVendor,
22+
Guid documentType,
23+
[MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedDocument document);
24+
25+
[PreserveSig]
26+
new int GetDocuments(
27+
int bufferLength,
28+
out int count,
29+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] documents);
30+
31+
[PreserveSig]
32+
new int GetUserEntryPoint(out int methodToken);
33+
34+
[PreserveSig]
35+
new int GetMethod(int methodToken, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod method);
36+
37+
[PreserveSig]
38+
new int GetMethodByVersion(
39+
int methodToken,
40+
int version,
41+
[MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod method);
42+
43+
[PreserveSig]
44+
new int GetVariables(
45+
int methodToken,
46+
int bufferLength,
47+
out int count,
48+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] variables);
49+
50+
[PreserveSig]
51+
new int GetGlobalVariables(
52+
int bufferLength,
53+
out int count,
54+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] variables);
55+
56+
[PreserveSig]
57+
new int GetMethodFromDocumentPosition(
58+
ISymUnmanagedDocument document,
59+
int line,
60+
int column,
61+
[MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod method);
62+
63+
[PreserveSig]
64+
new int GetSymAttribute(
65+
int methodToken,
66+
[MarshalAs(UnmanagedType.LPWStr)] string name,
67+
int bufferLength,
68+
out int count,
69+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] customDebugInformation);
70+
71+
[PreserveSig]
72+
new int GetNamespaces(
73+
int bufferLength,
74+
out int count,
75+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedNamespace[] namespaces);
76+
77+
[PreserveSig]
78+
new int Initialize(
79+
[MarshalAs(UnmanagedType.Interface)] object metadataImporter,
80+
[MarshalAs(UnmanagedType.LPWStr)] string fileName,
81+
[MarshalAs(UnmanagedType.LPWStr)] string searchPath,
82+
IStream stream);
83+
84+
[PreserveSig]
85+
new int UpdateSymbolStore([MarshalAs(UnmanagedType.LPWStr)] string fileName, IStream stream);
86+
87+
[PreserveSig]
88+
new int ReplaceSymbolStore([MarshalAs(UnmanagedType.LPWStr)] string fileName, IStream stream);
89+
90+
[PreserveSig]
91+
new int GetSymbolStoreFileName(
92+
int bufferLength,
93+
out int count,
94+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] name);
95+
96+
[PreserveSig]
97+
new int GetMethodsFromDocumentPosition(
98+
ISymUnmanagedDocument document,
99+
int line,
100+
int column,
101+
int bufferLength,
102+
out int count,
103+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] ISymUnmanagedMethod[] methods);
104+
105+
[PreserveSig]
106+
new int GetDocumentVersion(ISymUnmanagedDocument document, out int version, [MarshalAs(UnmanagedType.Bool)]out bool isCurrent);
107+
108+
[PreserveSig]
109+
new int GetMethodVersion(ISymUnmanagedMethod method, out int version);
110+
111+
#endregion
112+
113+
#region ISymUnmanagedReader2 methods
114+
115+
[PreserveSig]
116+
new int GetMethodByVersionPreRemap(
117+
int methodToken,
118+
int version,
119+
[MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedMethod method);
120+
121+
[PreserveSig]
122+
new int GetSymAttributePreRemap(
123+
int methodToken,
124+
[MarshalAs(UnmanagedType.LPWStr)] string name,
125+
int bufferLength,
126+
out int count,
127+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] customDebugInformation);
128+
129+
[PreserveSig]
130+
new int GetMethodsInDocument(
131+
ISymUnmanagedDocument document,
132+
int bufferLength,
133+
out int count,
134+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedMethod[] methods);
135+
136+
#endregion
137+
138+
#region ISymUnmanagedReader3 methods
139+
140+
/// <summary>
141+
/// Gets a custom debug information based upon its name and an EnC 1-based version number.
142+
/// </summary>
143+
[PreserveSig]
144+
new int GetSymAttributeByVersion(
145+
int methodToken,
146+
int version,
147+
[MarshalAs(UnmanagedType.LPWStr)] string name,
148+
int bufferLength,
149+
out int count,
150+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] customDebugInformation);
151+
152+
/// <summary>
153+
/// Gets a custom debug information based upon its name and an EnC 1-based version number.
154+
/// </summary>
155+
[PreserveSig]
156+
new int GetSymAttributeByVersionPreRemap(
157+
int methodToken,
158+
int version,
159+
[MarshalAs(UnmanagedType.LPWStr)] string name,
160+
int bufferLength,
161+
out int count,
162+
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] customDebugInformation);
163+
164+
#endregion
165+
166+
#region ISymUnmanagedReader4 methods
167+
168+
/// <summary>
169+
/// Checkes whether the id stored in the PDB matches the PDB ID stored in the PE/COFF Debug Directory.
170+
/// </summary>
171+
[PreserveSig]
172+
new int MatchesModule(Guid guid, uint stamp, int age, [MarshalAs(UnmanagedType.Bool)]out bool result);
173+
174+
/// <summary>
175+
/// Returns a pointer to Portable Debug Metadata. Only available for Portable PDBs.
176+
/// </summary>
177+
/// <param name="metadata">
178+
/// A pointer to memory where Portable Debug Metadata start. The memory is owned by the SymReader and
179+
/// valid until <see cref="ISymUnmanagedDispose.Destroy"/> is invoked.
180+
///
181+
/// Null if the PDB is not portable.
182+
/// </param>
183+
/// <param name="size">Size of the metadata block.</param>
184+
/// <returns>
185+
/// S_OK if the PDB is portable, S_FALSE if it isn't.
186+
/// </returns>
187+
/// <remarks>
188+
/// If the store was updated via <see cref="UpdateSymbolStore(string, IStream)"/>
189+
/// returns the metadata of the latest update.
190+
/// </remarks>
191+
[PreserveSig]
192+
new unsafe int GetPortableDebugMetadata(out byte* metadata, out int size);
193+
194+
/// <summary>
195+
/// Returns a pointer to Source Server data stored in the PDB.
196+
/// </summary>
197+
/// <param name="data">
198+
/// A pointer to memory where Source Server data start. The memory is owned by the SymReader and
199+
/// valid until <see cref="ISymUnmanagedDispose.Destroy"/> is invoked.
200+
///
201+
/// Null if the PDB doesn't contain Source Server data.
202+
/// </param>
203+
/// <param name="size">Size of the data in bytes.</param>
204+
/// <returns>
205+
/// S_OK if the PDB contains Source Server data, S_FALSE if it doesn't.
206+
/// </returns>
207+
[PreserveSig]
208+
new unsafe int GetSourceServerData(out byte* data, out int size);
209+
210+
#endregion
211+
212+
#region ISymUnmanagedReader5 methods
213+
214+
/// <summary>
215+
/// Returns a pointer to Portable Debug Metadata of the specified version (EnC generation). Only available for Portable PDBs.
216+
/// </summary>
217+
/// <param name="version">
218+
/// EnC 1-based version number. Version 1 corresponds to the baseline.
219+
/// </param>
220+
/// <param name="metadata">
221+
/// A pointer to memory where Portable Debug Metadata start. The memory is owned by the SymReader and
222+
/// valid until <see cref="ISymUnmanagedDispose.Destroy"/> is invoked.
223+
///
224+
/// Null if the PDB is not portable.
225+
/// </param>
226+
/// <param name="size">Size of the metadata block.</param>
227+
[PreserveSig]
228+
unsafe int GetPortableDebugMetadataByVersion(int version, out byte* metadata, out int size);
229+
230+
#endregion
231+
}
232+
}

src/Microsoft.DiaSymReader/Shared/Microsoft.DiaSymReader.projitems

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@
2222
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SymUnmanagedExtensions.Binder.cs" />
2323
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SymUnmanagedSequencePoint.cs" />
2424
<Compile Include="$(MSBuildThisFileDirectory)Extensions\SymUnmanagedStreamFactory.cs" />
25+
<Compile Include="$(MSBuildThisFileDirectory)ISymUnmanagedEncUpdate.cs" />
2526
<Compile Include="$(MSBuildThisFileDirectory)ISymUnmanagedBinder3.cs" />
2627
<Compile Include="$(MSBuildThisFileDirectory)IMetadataImportProvider.cs" />
2728
<Compile Include="$(MSBuildThisFileDirectory)ISymUnmanagedBinder4.cs" />
2829
<Compile Include="$(MSBuildThisFileDirectory)ISymUnmanagedReader4.cs" />
30+
<Compile Include="$(MSBuildThisFileDirectory)ISymUnmanagedReader5.cs" />
31+
<Compile Include="$(MSBuildThisFileDirectory)SymUnmanagedLineDelta.cs" />
2932
<Compile Include="$(MSBuildThisFileDirectory)SymUnmanagedSearchPolicy.cs" />
3033
<Compile Include="$(MSBuildThisFileDirectory)ISymEncUnmanagedMethod.cs" />
3134
<Compile Include="$(MSBuildThisFileDirectory)ISymUnmanagedAsyncMethod.cs" />

0 commit comments

Comments
 (0)