//===-- MCExternalSymbolizer.cpp - External symbolizer --------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/MC/MCDisassembler/MCExternalSymbolizer.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" #include <cstring> usingnamespacellvm; namespace llvm { class Triple; } // This function tries to add a symbolic operand in place of the immediate // Value in the MCInst. The immediate Value has had any PC adjustment made by // the caller. If the instruction is a branch instruction then IsBranch is true, // else false. If the getOpInfo() function was set as part of the // setupForSymbolicDisassembly() call then that function is called to get any // symbolic information at the Address for this instruction. If that returns // non-zero then the symbolic information it returns is used to create an MCExpr // and that is added as an operand to the MCInst. If getOpInfo() returns zero // and IsBranch is true then a symbol look up for Value is done and if a symbol // is found an MCExpr is created with that, else an MCExpr with Value is // created. This function returns true if it adds an operand to the MCInst and // false otherwise. bool MCExternalSymbolizer::tryAddingSymbolicOperand( MCInst &MI, raw_ostream &cStream, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) { … } // This function tries to add a comment as to what is being referenced by a load // instruction with the base register that is the Pc. These can often be values // in a literal pool near the Address of the instruction. The Address of the // instruction and its immediate Value are used as a possible literal pool entry. // The SymbolLookUp call back will return the name of a symbol referenced by the // literal pool's entry if the referenced address is that of a symbol. Or it // will return a pointer to a literal 'C' string if the referenced address of // the literal pool's entry is an address into a section with C string literals. // Or if the reference is to an Objective-C data structure it will return a // specific reference type for it and a string. void MCExternalSymbolizer::tryAddingPcLoadReferenceComment(raw_ostream &cStream, int64_t Value, uint64_t Address) { … } namespace llvm { MCSymbolizer *createMCSymbolizer(const Triple &TT, LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, MCContext *Ctx, std::unique_ptr<MCRelocationInfo> &&RelInfo) { … } }