本文整理汇总了C#中Reko.Core.ProcessorState.Clone方法的典型用法代码示例。如果您正苦于以下问题:C# ProcessorState.Clone方法的具体用法?C# ProcessorState.Clone怎么用?C# ProcessorState.Clone使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Reko.Core.ProcessorState
的用法示例。
在下文中一共展示了ProcessorState.Clone方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: EnqueueVectorTable
public void EnqueueVectorTable(Address addrFrom, Address addrTable, PrimitiveType elemSize, ushort segBase, bool calltable, Procedure proc, ProcessorState state)
{
ImageMapVectorTable table;
if (vectors.TryGetValue(addrTable, out table))
return;
table = new ImageMapVectorTable(addrTable, calltable);
var wi = new VectorWorkItem(this, program, table, proc);
wi.State = state.Clone();
wi.Stride = elemSize;
wi.SegBase = segBase;
wi.Table = table;
wi.AddrFrom = addrFrom;
imageMap.AddItem(addrTable, table);
vectors[addrTable] = table;
queue.Enqueue(PriorityVector, wi);
}
示例2: ScanProcedure
/// <summary>
/// Performs a scan of the blocks that constitute a procedure named <paramref name="procedureName"/>
/// </summary>
/// <param name="addr">Address of the code from which we will start scanning.</param>
/// <param name="procedureName"></param>
/// <param name="state"></param>
/// <returns></returns>
public ProcedureBase ScanProcedure(Address addr, string procedureName, ProcessorState state)
{
TerminateAnyBlockAt(addr);
var trampoline = GetTrampoline(addr);
if (trampoline != null)
return trampoline;
var imp = GetImportedProcedure(addr, addr);
if (imp != null)
return imp;
Procedure proc = EnsureProcedure(addr, procedureName);
if (visitedProcs.Contains(proc))
return proc;
visitedProcs.Add(proc);
Debug.WriteLineIf(trace.TraceInfo, string.Format("Scanning procedure at {0}", addr));
//$REFACTOR: make the stack explicit?
var oldQueue = queue;
queue = new PriorityQueue<WorkItem>();
var st = state.Clone();
st.OnProcedureEntered();
var sp = proc.Frame.EnsureRegister(program.Architecture.StackRegister);
st.SetValue(sp, proc.Frame.FramePointer);
SetAssumedRegisterValues(addr, st);
var block = EnqueueJumpTarget(addr, addr, proc, st);
proc.ControlGraph.AddEdge(proc.EntryBlock, block);
ProcessQueue();
queue = oldQueue;
// Add <stackpointer> := fp explicitly to the starting block.
proc.EntryBlock.Succ[0].Statements.Insert(0, addr.ToLinear(), new Assignment(sp, proc.Frame.FramePointer));
return proc;
}
示例3: ScanProcedure
/// <summary>
/// Performs a scan of the blocks that constitute a procedure named <paramref name="procedureName"/>
/// </summary>
/// <param name="addr">Address of the code from which we will start scanning.</param>
/// <param name="procedureName"></param>
/// <param name="state"></param>
/// <returns></returns>
public ProcedureBase ScanProcedure(Address addr, string procedureName, ProcessorState state)
{
TerminateAnyBlockAt(addr);
ExternalProcedure ep;
if (TryGetNoDecompiledProcedure(addr, out ep))
return ep;
if (program.InterceptedCalls.TryGetValue(addr, out ep))
return ep;
var trampoline = GetTrampoline(addr);
if (trampoline != null)
return trampoline;
var imp = GetImportedProcedure(addr, addr);
if (imp != null)
return imp;
Procedure proc = EnsureProcedure(addr, procedureName);
if (visitedProcs.Contains(proc))
return proc;
visitedProcs.Add(proc);
Debug.WriteLineIf(trace.TraceInfo, string.Format("Scanning procedure at {0}", addr));
var st = state.Clone();
EstablishInitialState(addr, st, proc);
//$REFACTOR: make the stack explicit?
var oldQueue = queue;
queue = new PriorityQueue<WorkItem>();
var block = EnqueueJumpTarget(addr, addr, proc, st);
proc.ControlGraph.AddEdge(proc.EntryBlock, block);
ProcessQueue();
queue = oldQueue;
InjectProcedureEntryInstructions(addr, proc);
var usb = new UserSignatureBuilder(program);
usb.BuildSignature(addr, proc);
return proc;
}