aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/Linking
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/CodeGen/Linking')
-rw-r--r--ARMeilleure/CodeGen/Linking/RelocEntry.cs38
-rw-r--r--ARMeilleure/CodeGen/Linking/RelocInfo.cs32
-rw-r--r--ARMeilleure/CodeGen/Linking/Symbol.cs100
-rw-r--r--ARMeilleure/CodeGen/Linking/SymbolType.cs28
4 files changed, 198 insertions, 0 deletions
diff --git a/ARMeilleure/CodeGen/Linking/RelocEntry.cs b/ARMeilleure/CodeGen/Linking/RelocEntry.cs
new file mode 100644
index 00000000..a27bfded
--- /dev/null
+++ b/ARMeilleure/CodeGen/Linking/RelocEntry.cs
@@ -0,0 +1,38 @@
+namespace ARMeilleure.CodeGen.Linking
+{
+ /// <summary>
+ /// Represents a relocation.
+ /// </summary>
+ readonly struct RelocEntry
+ {
+ public const int Stride = 13; // Bytes.
+
+ /// <summary>
+ /// Gets the position of the relocation.
+ /// </summary>
+ public int Position { get; }
+
+ /// <summary>
+ /// Gets the <see cref="Symbol"/> of the relocation.
+ /// </summary>
+ public Symbol Symbol { get; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="RelocEntry"/> struct with the specified position and
+ /// <see cref="Symbol"/>.
+ /// </summary>
+ /// <param name="position">Position of relocation</param>
+ /// <param name="symbol">Symbol of relocation</param>
+ public RelocEntry(int position, Symbol symbol)
+ {
+ Position = position;
+ Symbol = symbol;
+ }
+
+ /// <inheritdoc/>
+ public override string ToString()
+ {
+ return $"({nameof(Position)} = {Position}, {nameof(Symbol)} = {Symbol})";
+ }
+ }
+} \ No newline at end of file
diff --git a/ARMeilleure/CodeGen/Linking/RelocInfo.cs b/ARMeilleure/CodeGen/Linking/RelocInfo.cs
new file mode 100644
index 00000000..922b8bfe
--- /dev/null
+++ b/ARMeilleure/CodeGen/Linking/RelocInfo.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace ARMeilleure.CodeGen.Linking
+{
+ /// <summary>
+ /// Represents relocation information about a <see cref="CompiledFunction"/>.
+ /// </summary>
+ readonly struct RelocInfo
+ {
+ /// <summary>
+ /// Gets an empty <see cref="RelocInfo"/>.
+ /// </summary>
+ public static RelocInfo Empty { get; } = new RelocInfo(null);
+
+ private readonly RelocEntry[] _entries;
+
+ /// <summary>
+ /// Gets the set of <see cref="RelocEntry"/>.
+ /// </summary>
+ public ReadOnlySpan<RelocEntry> Entries => _entries ?? Array.Empty<RelocEntry>();
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="RelocInfo"/> struct with the specified set of
+ /// <see cref="RelocEntry"/>.
+ /// </summary>
+ /// <param name="entries">Set of <see cref="RelocInfo"/> to use</param>
+ public RelocInfo(RelocEntry[] entries)
+ {
+ _entries = entries ?? Array.Empty<RelocEntry>();
+ }
+ }
+} \ No newline at end of file
diff --git a/ARMeilleure/CodeGen/Linking/Symbol.cs b/ARMeilleure/CodeGen/Linking/Symbol.cs
new file mode 100644
index 00000000..fa47ee23
--- /dev/null
+++ b/ARMeilleure/CodeGen/Linking/Symbol.cs
@@ -0,0 +1,100 @@
+using System;
+
+namespace ARMeilleure.CodeGen.Linking
+{
+ /// <summary>
+ /// Represents a symbol.
+ /// </summary>
+ readonly struct Symbol
+ {
+ private readonly ulong _value;
+
+ /// <summary>
+ /// Gets the <see cref="SymbolType"/> of the <see cref="Symbol"/>.
+ /// </summary>
+ public SymbolType Type { get; }
+
+ /// <summary>
+ /// Gets the value of the <see cref="Symbol"/>.
+ /// </summary>
+ /// <exception cref="InvalidOperationException"><see cref="Type"/> is <see cref="SymbolType.None"/></exception>
+ public ulong Value
+ {
+ get
+ {
+ if (Type == SymbolType.None)
+ {
+ ThrowSymbolNone();
+ }
+
+ return _value;
+ }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Symbol"/> structure with the specified <see cref="SymbolType"/> and value.
+ /// </summary>
+ /// <param name="type">Type of symbol</param>
+ /// <param name="value">Value of symbol</param>
+ public Symbol(SymbolType type, ulong value)
+ {
+ (Type, _value) = (type, value);
+ }
+
+ /// <summary>
+ /// Determines if the specified <see cref="Symbol"/> instances are equal.
+ /// </summary>
+ /// <param name="a">First instance</param>
+ /// <param name="b">Second instance</param>
+ /// <returns><see langword="true"/> if equal; otherwise <see langword="false"/></returns>
+ public static bool operator ==(Symbol a, Symbol b)
+ {
+ return a.Equals(b);
+ }
+
+ /// <summary>
+ /// Determines if the specified <see cref="Symbol"/> instances are not equal.
+ /// </summary>
+ /// <param name="a">First instance</param>
+ /// <param name="b">Second instance</param>
+ /// <returns><see langword="true"/> if not equal; otherwise <see langword="false"/></returns>
+ /// <inheritdoc/>
+ public static bool operator !=(Symbol a, Symbol b)
+ {
+ return !(a == b);
+ }
+
+ /// <summary>
+ /// Determines if the specified <see cref="Symbol"/> is equal to this <see cref="Symbol"/> instance.
+ /// </summary>
+ /// <param name="other">Other <see cref="Symbol"/> instance</param>
+ /// <returns><see langword="true"/> if equal; otherwise <see langword="false"/></returns>
+ public bool Equals(Symbol other)
+ {
+ return other.Type == Type && other._value == _value;
+ }
+
+ /// <inheritdoc/>
+ public override bool Equals(object obj)
+ {
+ return obj is Symbol sym && Equals(sym);
+ }
+
+ /// <inheritdoc/>
+ public override int GetHashCode()
+ {
+ return HashCode.Combine(Type, _value);
+ }
+
+ /// <inheritdoc/>
+ public override string ToString()
+ {
+ return $"{Type}:{_value}";
+ }
+
+ private static void ThrowSymbolNone()
+ {
+ throw new InvalidOperationException("Symbol refers to nothing.");
+ }
+ }
+}
diff --git a/ARMeilleure/CodeGen/Linking/SymbolType.cs b/ARMeilleure/CodeGen/Linking/SymbolType.cs
new file mode 100644
index 00000000..b05b6969
--- /dev/null
+++ b/ARMeilleure/CodeGen/Linking/SymbolType.cs
@@ -0,0 +1,28 @@
+namespace ARMeilleure.CodeGen.Linking
+{
+ /// <summary>
+ /// Types of <see cref="Symbol"/>.
+ /// </summary>
+ enum SymbolType : byte
+ {
+ /// <summary>
+ /// Refers to nothing, i.e no symbol.
+ /// </summary>
+ None,
+
+ /// <summary>
+ /// Refers to an entry in <see cref="Translation.Delegates"/>.
+ /// </summary>
+ DelegateTable,
+
+ /// <summary>
+ /// Refers to an entry in <see cref="Translation.Translator.FunctionTable"/>.
+ /// </summary>
+ FunctionTable,
+
+ /// <summary>
+ /// Refers to a special symbol which is handled by <see cref="Translation.PTC.Ptc.PatchCode"/>.
+ /// </summary>
+ Special
+ }
+}