Code Snippet
foreach (Phx.IR.Instruction instruction in Phx.IR.Instruction.Iterator(functionUnit))
{
if (!instruction.IsCallInstruction)
{
continue;
}
Phx.IR.CallInstruction callInstruction = instruction.AsCallInstruction;
Phx.IR.Operand callTarget = callInstruction.CallTargetOperand;
if (!callTarget.IsMemory)
{
continue;
}
Phx.Symbols.Symbol memorySymbol = callTarget.Symbol;
if (memorySymbol == null || !memorySymbol.IsNonLocalVariableSymbol)
{
continue;
}
Phx.Symbols.GlobalVariableSymbol globalSymbol = memorySymbol.AsNonLocalVariableSymbol.GlobalSymbol;
// Now search the import modules for the PE File to find the import.
Phx.PEModuleUnit peModuleUnit = functionUnit.ParentPEModuleUnit;
foreach (Phx.Symbols.ImportModuleSymbol importModuleSymbol in peModuleUnit.ImportModuleSymbols)
{
foreach (Phx.Symbols.ImportSymbol importSymbol in importModuleSymbol.ImportSymbols)
{
if (importSymbol.ImportAddressTableSymbol == globalSymbol)
{
if (!emittedName)
{
Console.WriteLine("In {0}", functionUnit.NameString);
emittedName = true;
}
Console.WriteLine("Symbol {0} is {1} from {2}", globalSymbol, importSymbol, importModuleSymbol);
}
}
}
}
}