public DisassemblyContentProvider Create() { var blocks = BlockFactory.Create(bitness, this.blocks); var cachedSymResolver = new CachedSymbolResolver(); if (symbolResolver is not null) { var addresses = GetPossibleSymbolAddresses(blocks); if (addresses.Length != 0) { var symbolResolverResults = new SymbolResolverResult[addresses.Length]; symbolResolver.Resolve(addresses, symbolResolverResults); cachedSymResolver.AddSymbols(addresses, symbolResolverResults, fakeSymbol: false); } } foreach (var block in blocks) { if (!string2.IsNullOrEmpty(block.Label)) { cachedSymResolver.AddSymbol(block.Address, new SymbolResolverResult(SymbolKindUtils.ToSymbolKind(block.LabelKind), block.Label, block.Address), fakeSymbol: true); } } return(new DisassemblyContentProviderImpl(bitness, cachedSymResolver, deps.DisasmSettings, deps.MasmSettings, deps.NasmSettings, deps.GasSettings, formatterOptions, header, optimization, blocks, codeInfo, variableInfo, methodName, shortMethodName, moduleName)); }
public bool TryGetSymbol(int operand, int instructionOperand, ref Instruction instruction, ulong address, int addressSize, out SymbolResult symbol) { if (owner.cachedSymbolResolver.TryResolve(address, out var symResult, out bool fakeSymbol)) { if (!fakeSymbol || owner.AddLabels) { symbol = new SymbolResult(symResult.Address, symResult.Symbol, SymbolKindUtils.ToFormatterOutputTextKind(symResult.Kind), SymbolFlags.None); if (instruction.OpCount == 1 && (instruction.Op0Kind == OpKind.Memory || instruction.Op0Kind == OpKind.Memory64)) { var code = instruction.Code; if (code == Code.Call_rm32 || code == Code.Jmp_rm32) { symbol = new SymbolResult(symbol.Address, symbol.Text, symbol.Flags, MemorySize.DwordOffset); } else if (code == Code.Call_rm64 || code == Code.Jmp_rm64) { symbol = new SymbolResult(symbol.Address, symbol.Text, symbol.Flags, MemorySize.QwordOffset); } } return(true); } } symbol = default; return(false); }