diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2013-08-21 07:28:55 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2013-08-21 07:28:55 +0000 |
commit | f176482752fbea3139394e280adfb10270dd3aac (patch) | |
tree | fba35bb18383d23f4324ca185c63834618a0bf7d /include/llvm/MC/MCObjectDisassembler.h | |
parent | 05a81020d970dc0fe8ae29e484d06aae619a4ca4 (diff) | |
download | external_llvm-f176482752fbea3139394e280adfb10270dd3aac.zip external_llvm-f176482752fbea3139394e280adfb10270dd3aac.tar.gz external_llvm-f176482752fbea3139394e280adfb10270dd3aac.tar.bz2 |
MC CFG: Support disassembly at arbitrary addresses in MCObjectDisassembler.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188889 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/MC/MCObjectDisassembler.h')
-rw-r--r-- | include/llvm/MC/MCObjectDisassembler.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/include/llvm/MC/MCObjectDisassembler.h b/include/llvm/MC/MCObjectDisassembler.h index ab317e3..0d87d33 100644 --- a/include/llvm/MC/MCObjectDisassembler.h +++ b/include/llvm/MC/MCObjectDisassembler.h @@ -16,8 +16,11 @@ #define LLVM_MC_MCOBJECTDISASSEMBLER_H #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/DataTypes.h" +#include "llvm/Support/MemoryObject.h" +#include <vector> namespace llvm { @@ -55,6 +58,19 @@ public: MCModule *buildEmptyModule(); + typedef std::vector<uint64_t> AddressSetTy; + /// \name Create a new MCFunction. + MCFunction *createFunction(MCModule *Module, uint64_t BeginAddr, + AddressSetTy &CallTargets, + AddressSetTy &TailCallTargets); + + /// \brief Set the region on which to fallback if disassembly was requested + /// somewhere not accessible in the object file. + /// This is used for dynamic disassembly (see RawMemoryObject). + void setFallbackRegion(OwningPtr<MemoryObject> &Region) { + FallbackRegion.reset(Region.take()); + } + /// \brief Set the symbolizer to use to get information on external functions. /// Note that this isn't used to do instruction-level symbolization (that is, /// plugged into MCDisassembler), but to symbolize function call targets. @@ -96,6 +112,16 @@ protected: const MCInstrAnalysis &MIA; MCObjectSymbolizer *MOS; + /// \brief The fallback memory region, outside the object file. + OwningPtr<MemoryObject> FallbackRegion; + + /// \brief Return a memory region suitable for reading starting at \p Addr. + /// In most cases, this returns a StringRefMemoryObject backed by the + /// containing section. When no section was found, this returns the + /// FallbackRegion, if it is suitable. + /// If it is not, or if there is no fallback region, this returns 0. + MemoryObject *getRegionFor(uint64_t Addr); + private: /// \brief Fill \p Module by creating an atom for each section. /// This could be made much smarter, using information like symbols, but also @@ -108,6 +134,10 @@ private: /// When the CFG is built, contiguous instructions that were previously in a /// single MCTextAtom will be split in multiple basic block atoms. void buildCFG(MCModule *Module); + + MCBasicBlock *getBBAt(MCModule *Module, MCFunction *MCFN, uint64_t BeginAddr, + AddressSetTy &CallTargets, + AddressSetTy &TailCallTargets); }; class MCMachOObjectDisassembler : public MCObjectDisassembler { |