File: src\tools\illink\src\ILLink.Shared\DataFlow\ILattice.cs
Web Access
Project: src\src\tools\illink\src\ILLink.RoslynAnalyzer\ILLink.RoslynAnalyzer.csproj (ILLink.RoslynAnalyzer)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System;
 
// This is needed due to NativeAOT which doesn't enable nullable globally yet
#nullable enable
 
namespace ILLink.Shared.DataFlow
{
	// ILattice represents a lattice (technically a semilattice) of values.
	// A semilattice is a set of values along with a meet operation (or greatest lower bound).
	// The meet operation imposes a partial order on the values: a <= b iff Meet(a, b) == a.
 
	// In a dataflow analysis, the Meet operation is used to combine the tracked facts when
	// there are multiple control flow paths that reach the same program point (or in a backwards
	// analysis, to combine the tracked facts from multiple control flow paths out of a program point).
 
	// The interface constraint on TValue ensures that trying to instantiate
	// ILattice over a nullable type will produce a warning or error.
 
	// The lattice might be better represented as an interface describing individual lattice values
	// (as opposed to describing the lattice structure as ILattice does), with Top being a static
	// virtual interface method. This would avoid the need to pass around multiple generic arguments
	// (TValue and TLattice). However, we can't use static virtual interface methods in the analyzer
	// so the lattice instance provides the Top value.
	public interface ILattice<TValue> where TValue : IEquatable<TValue>
	{
		// We require that the lattice has a "Top" or maximum element.
		// Top is >= a for every element a of the lattice.
		// Top is an identity for Meet: Meet(a, Top) = a.
 
		// The typical use in a dataflow analysis is for Top to represent the "unknown" initial state
		// with the least possible information about the analysis.
		public TValue Top { get; }
 
		// The Meet operation is associative, commutative, and idempotent.
		// This is used in dataflow analysis to iteratively Meet the tracked facts from different control
		// flow paths until the analysis converges to the most specific set of tracked facts.
		public TValue Meet (TValue left, TValue right);
	}
}