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:
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2016-09-27 19:56:43 +0300
committerGitHub <noreply@github.com>2016-09-27 19:56:43 +0300
commita05f4934a88a17288799bc996f8fcd744b414909 (patch)
treec8115df708b228be37ae58b52feffe2d4d1df38b /src/ILCompiler.MetadataWriter
parent93e735a43817022df8dcd0b6570a89bfc253f70e (diff)
Extend metadata schema to support function pointers (#1928)
Also: * update `MetadataTransform` to emit the new metadata * a simple unit test
Diffstat (limited to 'src/ILCompiler.MetadataWriter')
-rw-r--r--src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs22
-rw-r--r--src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs65
2 files changed, 87 insertions, 0 deletions
diff --git a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs
index 2767c25ae..e49f28b49 100644
--- a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs
+++ b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/MdBinaryWriterGen.cs
@@ -1086,6 +1086,28 @@ namespace Internal.Metadata.NativeFormat.Writer
}
} // Write
+ public static void Write(this NativeWriter writer, FunctionPointerSignature record)
+ {
+ if (record != null)
+ writer.WriteUnsigned((uint)record.Handle.Offset);
+ else
+ writer.WriteUnsigned(0);
+ } // Write
+
+ public static void Write(this NativeWriter writer, List<FunctionPointerSignature> values)
+ {
+ if (values == null)
+ {
+ writer.WriteUnsigned(0);
+ return;
+ }
+ writer.WriteUnsigned((uint)values.Count);
+ foreach (FunctionPointerSignature value in values)
+ {
+ writer.Write(value);
+ }
+ } // Write
+
public static void Write(this NativeWriter writer, GenericParameter record)
{
if (record != null)
diff --git a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs
index 1afe7ecdc..79e969c0a 100644
--- a/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs
+++ b/src/ILCompiler.MetadataWriter/src/Internal/Metadata/NativeFormat/Writer/NativeFormatWriterGen.cs
@@ -2612,6 +2612,70 @@ namespace Internal.Metadata.NativeFormat.Writer
public MetadataRecord Value;
} // FixedArgument
+ public partial class FunctionPointerSignature : MetadataRecord
+ {
+ public override HandleType HandleType
+ {
+ get
+ {
+ return HandleType.FunctionPointerSignature;
+ }
+ } // HandleType
+
+ internal override void Visit(IRecordVisitor visitor)
+ {
+ Signature = visitor.Visit(this, Signature);
+ } // Visit
+
+ public override sealed bool Equals(Object obj)
+ {
+ if (Object.ReferenceEquals(this, obj)) return true;
+ var other = obj as FunctionPointerSignature;
+ if (other == null) return false;
+ if (!Object.Equals(Signature, other.Signature)) return false;
+ return true;
+ } // Equals
+
+ public override sealed int GetHashCode()
+ {
+ if (_hash != 0)
+ return _hash;
+ EnterGetHashCode();
+ int hash = 1733451879;
+ hash = ((hash << 13) - (hash >> 19)) ^ (Signature == null ? 0 : Signature.GetHashCode());
+ LeaveGetHashCode();
+ _hash = hash;
+ return _hash;
+ } // GetHashCode
+
+ internal override void Save(NativeWriter writer)
+ {
+ writer.Write(Signature);
+ } // Save
+
+ internal static FunctionPointerSignatureHandle AsHandle(FunctionPointerSignature record)
+ {
+ if (record == null)
+ {
+ return new FunctionPointerSignatureHandle(0);
+ }
+ else
+ {
+ return record.Handle;
+ }
+ } // AsHandle
+
+ internal new FunctionPointerSignatureHandle Handle
+ {
+ get
+ {
+ return new FunctionPointerSignatureHandle(HandleOffset);
+ }
+ } // Handle
+
+ public MethodSignature Signature;
+ } // FunctionPointerSignature
+
public partial class GenericParameter : MetadataRecord
{
public override HandleType HandleType
@@ -4813,6 +4877,7 @@ namespace Internal.Metadata.NativeFormat.Writer
Signature.HandleType == HandleType.SZArraySignature ||
Signature.HandleType == HandleType.ArraySignature ||
Signature.HandleType == HandleType.PointerSignature ||
+ Signature.HandleType == HandleType.FunctionPointerSignature ||
Signature.HandleType == HandleType.ByReferenceSignature ||
Signature.HandleType == HandleType.TypeVariableSignature ||
Signature.HandleType == HandleType.MethodTypeVariableSignature);