File: src\tools\illink\src\ILLink.Shared\DataFlow\ITransfer.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
{
	// ITransfer represents the transfer functions for a dataflow analysis.
	// The transfer functions compute the effects of an operation on the set of facts
	// tracked by a dataflow analysis. This simulates the execution of the operation
	// on the domain of abstract values tracked in the dataflow analysis.
 
	// TValue is the type of the information tracked in a dataflow analysis at each program point.
	// TLattice is the type of the lattice formed by these values.
 
	// TOperation is a type representing the operations that the transfer function
	// "simulates". It isn't constrained by the interface, but is typically a basic block,
	// where the transfer functions are defined in terms of transfer functions for individual
	// operations in the block.
 
	// TLattice isn't typically used in the implementation except to provide the "Top" value.
	// This expresses the conceptual constraint that the transferred values are part of a lattice.
	public interface ITransfer<TOperation, TValue, TState, TLattice, TConditionValue>
		where TValue : struct, IEquatable<TValue>
		where TState : class, IDataFlowState<TValue, TLattice>
		where TLattice : ILattice<TValue>
		where TConditionValue : struct, INegate<TConditionValue>
	{
		// Transfer should mutate the input value to reflect the effect of
		// computing this operation. When using value types, ensure that
		// any modifications to the values are observable by the caller (consider
		// using readonly structs to prevent the implementation from making changes
		// that won't be reflected in the caller).
		// The optional return value can be used to model branch conditions.
		TConditionValue? Transfer (TOperation operation, TState state);
 
		// Applies a condition value to a dataflow value. This is called in the
		// outgoing branch of a basic block which returns a TConditionValue
		// to model the state in the conditional branch where the condition is
		// assumed to be true.
		void ApplyCondition (TConditionValue condition, ref TValue value);
	}
 
	public interface INegate<TValue>
	{
		TValue Negate ();
	}
}