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)