MCObjectDisassembler.h revision ef99356dfebb96f6f90efb912c2877214bad060e
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===-- llvm/MC/MCObjectDisassembler.h --------------------------*- C++ -*-===// 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// The LLVM Compiler Infrastructure 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// License. See LICENSE.TXT for details. 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//===----------------------------------------------------------------------===// 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This file contains the declaration of the MCObjectDisassembler class, which 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// can be used to construct an MCModule and an MC CFG from an ObjectFile. 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//===----------------------------------------------------------------------===// 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef LLVM_MC_MCOBJECTDISASSEMBLER_H 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define LLVM_MC_MCOBJECTDISASSEMBLER_H 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace llvm { 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace object { 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class ObjectFile; 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MCBasicBlock; 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MCDisassembler; 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MCFunction; 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MCInstrAnalysis; 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MCModule; 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// \brief Disassemble an ObjectFile to an MCModule and MCFunctions. 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// This class builds on MCDisassembler to disassemble whole sections, creating 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// MCAtom (MCTextAtom for disassembled sections and MCDataAtom for raw data). 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// It can also be used to create a control flow graph consisting of MCFunctions 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// and MCBasicBlocks. 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MCObjectDisassembler { 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const object::ObjectFile &Obj; 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const MCDisassembler &Dis; 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const MCInstrAnalysis &MIA; 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)public: 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MCObjectDisassembler(const object::ObjectFile &Obj, 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const MCDisassembler &Dis, 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const MCInstrAnalysis &MIA); 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// \brief Build an MCModule, creating atoms and optionally functions. 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// \param withCFG Also build a CFG by adding MCFunctions to the Module. 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /// If withCFG is false, the MCModule built only contains atoms, representing 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /// what was found in the object file. If withCFG is true, MCFunctions are 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /// created, containing MCBasicBlocks. All text atoms are split to form basic 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) /// block atoms, which then each back an MCBasicBlock. 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MCModule *buildModule(bool withCFG = false); 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)private: 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// \brief Fill \p Module by creating an atom for each section. 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// This could be made much smarter, using information like symbols, but also 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// format-specific features, like mach-o function_start or data_in_code LCs. 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void buildSectionAtoms(MCModule *Module); 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// \brief Enrich \p Module with a CFG consisting of MCFunctions. 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// \param Module An MCModule returned by buildModule, with no CFG. 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// NOTE: Each MCBasicBlock in a MCFunction is backed by a single MCTextAtom. 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// When the CFG is built, contiguous instructions that were previously in a 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /// single MCTextAtom will be split in multiple basic block atoms. 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void buildCFG(MCModule *Module); 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)