MC CFG: Add MCObjectDisassembler Mach-O implementation.

Supports:
- entrypoint, using LC_MAIN.
- static ctors/dtors, using __mod_{init,exit}_func
- translation between effective and object load address, using
  dyld's VM address slide.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188886 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ahmed Bougacha
2013-08-21 07:28:44 +00:00
parent fe018c4145
commit 0e83b90283
2 changed files with 120 additions and 0 deletions

View File

@ -23,6 +23,7 @@ namespace llvm {
namespace object {
class ObjectFile;
class MachOObjectFile;
}
class MCBasicBlock;
@ -100,6 +101,36 @@ private:
void buildCFG(MCModule *Module);
};
class MCMachOObjectDisassembler : public MCObjectDisassembler {
const object::MachOObjectFile &MOOF;
uint64_t VMAddrSlide;
uint64_t HeaderLoadAddress;
// __DATA;__mod_init_func support.
llvm::StringRef ModInitContents;
// __DATA;__mod_exit_func support.
llvm::StringRef ModExitContents;
public:
/// \brief Construct a Mach-O specific object disassembler.
/// \param VMAddrSlide The virtual address slide applied by dyld.
/// \param HeaderLoadAddress The load address of the mach_header for this
/// object.
MCMachOObjectDisassembler(const object::MachOObjectFile &MOOF,
const MCDisassembler &Dis,
const MCInstrAnalysis &MIA, uint64_t VMAddrSlide,
uint64_t HeaderLoadAddress);
protected:
uint64_t getEffectiveLoadAddr(uint64_t Addr) LLVM_OVERRIDE;
uint64_t getOriginalLoadAddr(uint64_t EffectiveAddr) LLVM_OVERRIDE;
uint64_t getEntrypoint() LLVM_OVERRIDE;
ArrayRef<uint64_t> getStaticInitFunctions() LLVM_OVERRIDE;
ArrayRef<uint64_t> getStaticExitFunctions() LLVM_OVERRIDE;
};
}
#endif