/* * Copyright 2018 faddenSoft * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; namespace SourceGen { /// /// Tracks a set of offsets that reference a single address or label. /// /// This is used internally, when refactoring labels, as well as for the "references" /// UI panel and label localizer. /// public class XrefSet : IEnumerable { /// /// Reference type. This is mostly useful for display to the user. /// public enum XrefType { Unknown = 0, InstrOperand, // generic instruction operand BranchOperand, // branch instruction DataOperand // e.g. ".dd2
" } /// /// Cross-reference descriptor. Instances are immutable. /// public class Xref { /// /// Offset of start of instruction or data with the reference. /// public int Offset { get; private set; } /// /// True if this reference is by name. /// public bool IsSymbolic { get; private set; } /// /// Type of reference. /// public XrefType Type { get; private set; } /// /// Adjustment to symbol. For example, "LDA label+2" adds an xref entry to /// "label", with an adjustment of +2. /// public int Adjustment { get; private set; } public Xref(int offset, bool isSymbolic, XrefType type, int adjustment) { Offset = offset; IsSymbolic = isSymbolic; Type = type; Adjustment = adjustment; } public override string ToString() { return "Xref off=+" + Offset.ToString("x6") + " sym=" + IsSymbolic + " type=" + Type + " adj=" + Adjustment; } } /// /// Internal storage for xrefs. /// private List mRefs = new List(); /// /// Constructs an empty set. /// public XrefSet() { } /// /// Returns the number of cross-references in the set. /// public int Count { get { return mRefs.Count; } } /// /// Removes all entries from the set. /// public void Clear() { mRefs.Clear(); } /// /// Returns the Nth entry in the set. /// public Xref this[int index] { get { return mRefs[index]; } } /// /// Adds an xref to the set. /// public void Add(Xref xref) { // TODO(someday): not currently enforcing set behavior; start by adding .equals to // Xref, then check Contains before allowing Add. (Should probably complain // loudly if item already exists, since we're not expecting that.) mRefs.Add(xref); } // IEnumerable public IEnumerator GetEnumerator() { return ((IEnumerable)mRefs).GetEnumerator(); } // IEnumerable, generic IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)mRefs).GetEnumerator(); } } }