| File: Compiler\ExportsFileWriter.cs | Web Access |
| Project: src\runtime\src\coreclr\tools\aot\ILCompiler.Compiler\ILCompiler.Compiler.csproj (ILCompiler.Compiler) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.IO; using Internal.TypeSystem; using Internal.TypeSystem.Ecma; namespace ILCompiler { public class ExportsFileWriter { private readonly string _exportsFile; private readonly string[] _exportSymbols; private readonly List<EcmaMethod> _methods; private readonly TypeSystemContext _context; public ExportsFileWriter(TypeSystemContext context, string exportsFile, string[] exportSymbols) { _exportsFile = exportsFile; _exportSymbols = exportSymbols; _context = context; _methods = new List<EcmaMethod>(); } public void AddExportedMethods(IEnumerable<EcmaMethod> methods, CompilationResults compilationResults) { foreach (EcmaMethod method in methods) { // Some of the exported methods could be conditioned with UnmanagedCallersOnly.AssociatedSourceType // so need to filter down to compiled methods. if (compilationResults.IsMethodBodyCompiled(method)) _methods.Add(method); } } public void EmitExportedMethods() { FileStream fileStream = new FileStream(_exportsFile, FileMode.Create); using (StreamWriter streamWriter = new StreamWriter(fileStream)) { if (_context.Target.IsWindows) { streamWriter.WriteLine("EXPORTS"); foreach (string symbol in _exportSymbols) streamWriter.WriteLine($" {symbol.Replace(',', ' ')}"); foreach (var method in _methods) streamWriter.WriteLine($" {method.GetUnmanagedCallersOnlyExportName()}"); } else if (_context.Target.IsApplePlatform) { foreach (string symbol in _exportSymbols) streamWriter.WriteLine($"_{symbol}"); foreach (var method in _methods) streamWriter.WriteLine($"_{method.GetUnmanagedCallersOnlyExportName()}"); } else { streamWriter.WriteLine("V1.0 {"); if (_exportSymbols.Length != 0 || _methods.Count != 0) { streamWriter.WriteLine(" global:"); foreach (string symbol in _exportSymbols) streamWriter.WriteLine($" {symbol};"); foreach (var method in _methods) streamWriter.WriteLine($" {method.GetUnmanagedCallersOnlyExportName()};"); } streamWriter.WriteLine(" local: *;"); streamWriter.WriteLine("};"); } } } } }