Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion source/MetadataProcessor.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,15 @@ public void Compile(

_assemblyBuilder = new nanoAssemblyBuilder(_assemblyDefinition, _classNamesToExclude, VerboseMinimize, isCoreLibrary);

using (var stream = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite))
using (var stream = File.Open(Path.ChangeExtension(fileName, "tmp"), FileMode.Create, FileAccess.ReadWrite))
using (var writer = new BinaryWriter(stream))
{
_assemblyBuilder.Write(GetBinaryWriter(writer));
}

// OK to delete tmp PE file
File.Delete(Path.ChangeExtension(fileName, "tmp"));

if (Verbose) System.Console.WriteLine("Minimizing assembly...");

_assemblyBuilder.Minimize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ protected override void WriteSingleItem(
nanoBinaryWriter writer,
AssemblyNameReference item)
{
if (!_context.MinimizeComplete)
{
return;
}

WriteStringReference(writer, item.Name);
writer.WriteUInt16(0); // padding

Expand Down
8 changes: 4 additions & 4 deletions source/MetadataProcessor.Core/Tables/nanoByteCodeTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ public sealed class nanoByteCodeTable : InanoTable
private readonly IList<MethodDefinition> _methods = new List<MethodDefinition>();

/// <summary>
/// Maps method full names to method RVAs (offsets in resutling table).
/// Maps method full names to method RVAs (offsets in resulting table).
/// </summary>
private readonly IDictionary<string, ushort> _rvasByMethodNames =
new Dictionary<string, ushort>(StringComparer.Ordinal);

/// <summary>
/// Temprorary string table for code generators used duing initial load.
/// Temporary string table for code generators used during initial load.
/// </summary>
private readonly nanoStringTable _fakeStringTable = new nanoStringTable();

Expand All @@ -57,12 +57,12 @@ public nanoByteCodeTable(
}

/// <summary>
/// Next method identifier. Used for reproducing strange original MetadataProcessor behavior.
/// Next method identifier. Used for reproducing strange original MetadataProcessor behaviour.
/// </summary>
public ushort NextMethodId { get { return (ushort)_methods.Count; } }

/// <summary>
/// Temprorary string table for code generators used duing initial load.
/// Temporary string table for code generators used duing initial load.
/// </summary>
public nanoStringTable FakeStringTable { get { return _fakeStringTable; } }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ protected override void WriteSingleItem(
nanoBinaryWriter writer,
FieldDefinition item)
{
if (!_context.MinimizeComplete)
{
return;
}

WriteStringReference(writer, item.Name);
writer.WriteUInt16(_context.SignaturesTable.GetOrCreateSignatureId(item));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@ protected override void WriteSingleItem(
nanoBinaryWriter writer,
FieldReference item)
{
if (!_context.MinimizeComplete)
{
return;
}

ushort referenceId;
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Mono.Cecil;
using System;
using System.Collections.Generic;
using Mono.Cecil;

namespace nanoFramework.Tools.MetadataProcessor
{
Expand Down Expand Up @@ -62,6 +62,11 @@ protected override void WriteSingleItem(
nanoBinaryWriter writer,
MethodDefinition item)
{
if (!_context.MinimizeComplete)
{
return;
}

WriteStringReference(writer, item.Name);
writer.WriteUInt16(_context.ByteCodeTable.GetMethodRva(item));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,11 @@ protected override void WriteSingleItem(
nanoBinaryWriter writer,
MethodReference item)
{
if (!_context.MinimizeComplete)
{
return;
}

ushort referenceId;
_context.TypeReferencesTable.TryGetTypeReferenceId(item.DeclaringType, out referenceId);

Expand Down
1 change: 1 addition & 0 deletions source/MetadataProcessor.Core/Tables/nanoTablesContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ public ushort GetMethodReferenceId(
public nanoResourceFileTable ResourceFileTable { get; private set; }

public static List<string> ClassNamesToExclude { get; private set; }
public bool MinimizeComplete { get; internal set; } = false;

private IEnumerable<Tuple<CustomAttribute, ushort>> GetAttributes(
IEnumerable<ICustomAttributeProvider> types,
Expand Down
44 changes: 24 additions & 20 deletions source/MetadataProcessor.Core/Tables/nanoTypeDefinitionTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,34 +110,38 @@ protected override void WriteSingleItem(
{
WriteClassFields(fieldsList, writer.GetMemoryBasedClone(stream));

if (item.DeclaringType == null)
if (_context.MinimizeComplete)
{
foreach (var method in item.Methods)
{
var offsets = CodeWriter
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
.ToList();

_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
if (item.DeclaringType == null)
{
foreach (var method in item.Methods)
{
var offsets = CodeWriter
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
.ToList();

_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
}
}
}
foreach (var nestedType in item.NestedTypes)
{
foreach (var method in nestedType.Methods)
foreach (var nestedType in item.NestedTypes)
{
var offsets = CodeWriter
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
.ToList();

_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
foreach (var method in nestedType.Methods)
{
var offsets = CodeWriter
.PreProcessMethod(method, _context.ByteCodeTable.FakeStringTable)
.ToList();

_byteCodeOffsets.Add(method.MetadataToken.ToUInt32(), offsets);
}
}
}

WriteMethodBodies(item.Methods, item.Interfaces, writer);
WriteMethodBodies(item.Methods, item.Interfaces, writer);

_context.SignaturesTable.WriteDataType(item, writer, false, true, true);
_context.SignaturesTable.WriteDataType(item, writer, false, true, true);

writer.WriteBytes(stream.ToArray());
writer.WriteBytes(stream.ToArray());
}
}

writer.WriteUInt16((ushort)GetFlags(item)); // flags
Expand Down
15 changes: 15 additions & 0 deletions source/MetadataProcessor.Core/Utility/nanoPdbxFileWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Mono.Cecil;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Xml;
Expand Down Expand Up @@ -75,13 +76,27 @@ private void WriteClassInfo(
writer.WriteElementString("HasByteCode", "false");
}
writer.WriteStartElement("ILMap");

// sanity check vars
uint prevItem1 = 0;
uint prevItem2 = 0;

foreach (var offset in _context.TypeDefinitionTable.GetByteCodeOffsets(tuple.Item1))
{
if (prevItem1 > 0)
{
// 1st pass, load prevs with current values
Debug.Assert(prevItem1 < offset.Item1);
Debug.Assert(prevItem2 < offset.Item2);
}
writer.WriteStartElement("IL");

writer.WriteElementString("CLR", "0x" + offset.Item1.ToString("X8", CultureInfo.InvariantCulture));
writer.WriteElementString("nanoCLR", "0x" + offset.Item2.ToString("X8", CultureInfo.InvariantCulture));

prevItem1 = offset.Item1;
prevItem2 = offset.Item2;

writer.WriteEndElement();
}
writer.WriteEndElement();
Expand Down
3 changes: 3 additions & 0 deletions source/MetadataProcessor.Core/nanoAssemblyBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,9 @@ public void Minimize()

interfacesToRemove.Select(i => c.Interfaces.Remove(i)).ToList();
}

// flag minimize completed
_tablesContext.MinimizeComplete = true;
}

private void ShowDependencies(MetadataToken token, HashSet<MetadataToken> set, HashSet<MetadataToken> setTmp)
Expand Down