MCObjectDisassembler.h revision 0a30cccd493e3bc82a5771ca15326f7cc8b6cb8c
1//===-- llvm/MC/MCObjectDisassembler.h --------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the declaration of the MCObjectDisassembler class, which 11// can be used to construct an MCModule and an MC CFG from an ObjectFile. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_MC_MCOBJECTDISASSEMBLER_H 16#define LLVM_MC_MCOBJECTDISASSEMBLER_H 17 18#include "llvm/ADT/ArrayRef.h" 19#include "llvm/ADT/StringRef.h" 20#include "llvm/Support/DataTypes.h" 21 22namespace llvm { 23 24namespace object { 25 class ObjectFile; 26} 27 28class MCBasicBlock; 29class MCDisassembler; 30class MCFunction; 31class MCInstrAnalysis; 32class MCModule; 33 34/// \brief Disassemble an ObjectFile to an MCModule and MCFunctions. 35/// This class builds on MCDisassembler to disassemble whole sections, creating 36/// MCAtom (MCTextAtom for disassembled sections and MCDataAtom for raw data). 37/// It can also be used to create a control flow graph consisting of MCFunctions 38/// and MCBasicBlocks. 39class MCObjectDisassembler { 40public: 41 MCObjectDisassembler(const object::ObjectFile &Obj, 42 const MCDisassembler &Dis, 43 const MCInstrAnalysis &MIA); 44 virtual ~MCObjectDisassembler() {} 45 46 /// \brief Build an MCModule, creating atoms and optionally functions. 47 /// \param withCFG Also build a CFG by adding MCFunctions to the Module. 48 /// If withCFG is false, the MCModule built only contains atoms, representing 49 /// what was found in the object file. If withCFG is true, MCFunctions are 50 /// created, containing MCBasicBlocks. All text atoms are split to form basic 51 /// block atoms, which then each back an MCBasicBlock. 52 MCModule *buildModule(bool withCFG = false); 53 54 MCModule *buildEmptyModule(); 55 56 /// \brief Get the effective address of the entrypoint, or 0 if there is none. 57 virtual uint64_t getEntrypoint(); 58 59 /// \name Get the addresses of static constructors/destructors in the object. 60 /// The caller is expected to know how to interpret the addresses; 61 /// for example, Mach-O init functions expect 5 arguments, not for ELF. 62 /// The addresses are original object file load addresses, not effective. 63 /// @{ 64 virtual ArrayRef<uint64_t> getStaticInitFunctions(); 65 virtual ArrayRef<uint64_t> getStaticExitFunctions(); 66 /// @} 67 68protected: 69 const object::ObjectFile &Obj; 70 const MCDisassembler &Dis; 71 const MCInstrAnalysis &MIA; 72 73private: 74 /// \brief Fill \p Module by creating an atom for each section. 75 /// This could be made much smarter, using information like symbols, but also 76 /// format-specific features, like mach-o function_start or data_in_code LCs. 77 void buildSectionAtoms(MCModule *Module); 78 79 /// \brief Enrich \p Module with a CFG consisting of MCFunctions. 80 /// \param Module An MCModule returned by buildModule, with no CFG. 81 /// NOTE: Each MCBasicBlock in a MCFunction is backed by a single MCTextAtom. 82 /// When the CFG is built, contiguous instructions that were previously in a 83 /// single MCTextAtom will be split in multiple basic block atoms. 84 void buildCFG(MCModule *Module); 85}; 86 87} 88 89#endif 90