Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2016-01-12 02:48:44 +0300
committerJan Kotas <jkotas@microsoft.com>2016-01-12 02:48:44 +0300
commit13a2850056adda83ab6dab214ec562458158b01e (patch)
tree1c482aeb73fb802819ef3bf7d57da56c64ada9ed /src/ILCompiler.Compiler
parentcc91e1803f1ddea3f7b3da059c7937b7547d5d65 (diff)
Make UnmanagedPdbSymbolReader work when running on CoreCLR
Change the initialization of UnmanagedPdbSymbolReader to use hosting APIs from the full .NET Framework.
Diffstat (limited to 'src/ILCompiler.Compiler')
-rw-r--r--src/ILCompiler.Compiler/src/Compiler/SymbolReader/UnmanagedPdbSymbolReader.cs90
1 files changed, 62 insertions, 28 deletions
diff --git a/src/ILCompiler.Compiler/src/Compiler/SymbolReader/UnmanagedPdbSymbolReader.cs b/src/ILCompiler.Compiler/src/Compiler/SymbolReader/UnmanagedPdbSymbolReader.cs
index b4e41db9d..55486d5a7 100644
--- a/src/ILCompiler.Compiler/src/Compiler/SymbolReader/UnmanagedPdbSymbolReader.cs
+++ b/src/ILCompiler.Compiler/src/Compiler/SymbolReader/UnmanagedPdbSymbolReader.cs
@@ -14,38 +14,57 @@ namespace ILCompiler.SymbolReader
/// </summary>
internal sealed class UnmanagedPdbSymbolReader : PdbSymbolReader
{
- [Guid("809c652e-7396-11d2-9771-00a0c9b4d50c")]
+ [DllImport("mscoree.dll")]
+ private static extern int CLRCreateInstance([In] ref Guid clsid, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out ICLRMetaHost ppInterface);
+
+ [Guid("d332db9e-b9b3-4125-8207-a14884f53216")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
- private interface IMetaDataDispenser
+ interface ICLRMetaHost
{
- // We need to be able to call OpenScope, which is the 2nd vtable slot.
- // Thus we need this one placeholder here to occupy the first slot..
- void DefineScope_Placeholder();
-
[PreserveSig]
- int OpenScope([In, MarshalAs(UnmanagedType.LPWStr)] String szScope, [In] Int32 dwOpenFlags, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.IUnknown)] out Object punk);
+ int GetRuntime([In, MarshalAs(UnmanagedType.LPWStr)] String pwzVersion, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out ICLRRuntimeInfo ppRuntime);
// Don't need any other methods.
}
- // Since we're just blindly passing this interface through managed code to the Symbinder, we don't care about actually
- // importing the specific methods.
- // This needs to be public so that we can call Marshal.GetComInterfaceForObject() on it to get the
- // underlying metadata pointer.
- [Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44")]
+ [Guid("bd39d1d2-ba2f-486a-89b0-b4b0cb466891")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComVisible(true)]
- public interface IMetadataImport
+ interface ICLRRuntimeInfo
{
- // Just need a single placeholder method so that it doesn't complain about an empty interface.
- void Placeholder();
+ void GetVersionString_Placeholder();
+ void GetRuntimeDirectory_Placeholder();
+ void IsLoaded_Placeholder();
+ void LoadErrorString_Placeholder();
+ void LoadLibrary_Placeholder();
+ void GetProcAddress_Placeholder();
+
+ [PreserveSig]
+ int GetInterface([In] ref Guid rclsid, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.IUnknown)] out Object ppUnk);
+
+ void IsLoadable_Placeholder();
+ void SetDefaultStartupFlags_Placeholder();
+ void GetDefaultStartupFlags_Placeholder();
+
+ [PreserveSig]
+ int BindAsLegacyV2Runtime();
+
+ // Don't need any other methods.
}
- [DllImport("clr.dll")]
- private static extern int MetaDataGetDispenser([In] ref Guid rclsid,
- [In] ref Guid riid,
- [Out, MarshalAs(UnmanagedType.Interface)] out Object ppv);
+ [Guid("809c652e-7396-11d2-9771-00a0c9b4d50c")]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [ComVisible(true)]
+ private interface IMetaDataDispenser
+ {
+ void DefineScope_Placeholder();
+
+ [PreserveSig]
+ int OpenScope([In, MarshalAs(UnmanagedType.LPWStr)] String szScope, [In] Int32 dwOpenFlags, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.IUnknown)] out Object punk);
+
+ // Don't need any other methods.
+ }
[DllImport("ole32.dll")]
private static extern int CoCreateInstance(ref Guid rclsid, IntPtr pUnkOuter,
@@ -62,21 +81,36 @@ namespace ILCompiler.SymbolReader
{
try
{
+ Guid IID_IUnknown = new Guid(0x00000000, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
+
+ ICLRMetaHost objMetaHost;
+ Guid CLSID_CLRMetaHost = new Guid(0x9280188d, 0x0e8e, 0x4867, 0xb3, 0x0c, 0x7f, 0xa8, 0x38, 0x84, 0xe8, 0xde);
+ Guid IID_CLRMetaHost = new Guid(0xd332db9e, 0xb9b3, 0x4125, 0x82, 0x07, 0xa1, 0x48, 0x84, 0xf5, 0x32, 0x16);
+ if (CLRCreateInstance(ref CLSID_CLRMetaHost, ref IID_CLRMetaHost, out objMetaHost) < 0)
+ return;
+
+ ICLRRuntimeInfo objRuntime;
+ Guid IID_CLRRuntimeInfo = new Guid(0xbd39d1d2, 0xba2f, 0x486a, 0x89, 0xb0, 0xb4, 0xb0, 0xcb, 0x46, 0x68, 0x91);
+ if (objMetaHost.GetRuntime("v4.0.30319", ref IID_CLRRuntimeInfo, out objRuntime) < 0)
+ return;
+
+ // To get everything from the v4 runtime
+ objRuntime.BindAsLegacyV2Runtime();
+
// Create a COM Metadata dispenser
- Guid dispenserClassID = new Guid(0xe5cb7a31, 0x7512, 0x11d2, 0x89, 0xce, 0x00, 0x80, 0xc7, 0x92, 0xe5, 0xd8); // CLSID_CorMetaDataDispenser
- Guid dispenserIID = new Guid(0x809c652e, 0x7396, 0x11d2, 0x97, 0x71, 0x00, 0xa0, 0xc9, 0xb4, 0xd5, 0x0c); // IID_IMetaDataDispenser
object objDispenser;
- if (MetaDataGetDispenser(ref dispenserClassID, ref dispenserIID, out objDispenser) < 0)
+ Guid CLSID_CorMetaDataDispenser = new Guid(0xe5cb7a31, 0x7512, 0x11d2, 0x89, 0xce, 0x00, 0x80, 0xc7, 0x92, 0xe5, 0xd8);
+ if (objRuntime.GetInterface(ref CLSID_CorMetaDataDispenser, ref IID_IUnknown, out objDispenser) < 0)
return;
s_metadataDispenser = (IMetaDataDispenser)objDispenser;
- Guid symBinderClassID = new Guid(0x0A29FF9E, 0x7F9C, 0x4437, 0x8B, 0x11, 0xF4, 0x24, 0x49, 0x1E, 0x39, 0x31); // CLSID_CorSymBinder
- Guid symBinderIID = new Guid(0xAA544d42, 0x28CB, 0x11d3, 0xbd, 0x22, 0x00, 0x00, 0xf8, 0x08, 0x49, 0xbd); // IID_ISymUnmanagedBinder
+ // Create a SymBinder
object objBinder;
- if (CoCreateInstance(ref symBinderClassID,
+ Guid CLSID_CorSymBinder = new Guid(0x0a29ff9e, 0x7f9c, 0x4437, 0x8b, 0x11, 0xf4, 0x24, 0x49, 0x1e, 0x39, 0x31);
+ if (CoCreateInstance(ref CLSID_CorSymBinder,
IntPtr.Zero, // pUnkOuter
1, // CLSCTX_INPROC_SERVER
- ref symBinderIID,
+ ref IID_IUnknown,
out objBinder) < 0)
return;
s_symBinder = (ISymUnmanagedBinder)objBinder;
@@ -93,12 +127,12 @@ namespace ILCompiler.SymbolReader
{
try
{
- Guid importerIID = new Guid(0x7dac8207, 0xd3ae, 0x4c75, 0x9b, 0x67, 0x92, 0x80, 0x1a, 0x49, 0x7d, 0x44); // IID_IMetaDataImport
+ Guid IID_IMetaDataImport = new Guid(0x7dac8207, 0xd3ae, 0x4c75, 0x9b, 0x67, 0x92, 0x80, 0x1a, 0x49, 0x7d, 0x44);
// Open an metadata importer on the given filename. We'll end up passing this importer straight
// through to the Binder.
object objImporter;
- if (s_metadataDispenser.OpenScope(metadataFileName, 0x00000010 /* read only */, ref importerIID, out objImporter) < 0)
+ if (s_metadataDispenser.OpenScope(metadataFileName, 0x00000010 /* read only */, ref IID_IMetaDataImport, out objImporter) < 0)
return null;
ISymUnmanagedReader reader;