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
18namespace llvm {
19
20namespace object {
21  class ObjectFile;
22}
23
24class MCBasicBlock;
25class MCDisassembler;
26class MCFunction;
27class MCInstrAnalysis;
28class MCModule;
29
30/// \brief Disassemble an ObjectFile to an MCModule and MCFunctions.
31/// This class builds on MCDisassembler to disassemble whole sections, creating
32/// MCAtom (MCTextAtom for disassembled sections and MCDataAtom for raw data).
33/// It can also be used to create a control flow graph consisting of MCFunctions
34/// and MCBasicBlocks.
35class MCObjectDisassembler {
36  const object::ObjectFile &Obj;
37  const MCDisassembler &Dis;
38  const MCInstrAnalysis &MIA;
39
40public:
41  MCObjectDisassembler(const object::ObjectFile &Obj,
42                       const MCDisassembler &Dis,
43                       const MCInstrAnalysis &MIA);
44
45  /// \brief Build an MCModule, creating atoms and optionally functions.
46  /// \param withCFG Also build a CFG by adding MCFunctions to the Module.
47  /// If withCFG is false, the MCModule built only contains atoms, representing
48  /// what was found in the object file. If withCFG is true, MCFunctions are
49  /// created, containing MCBasicBlocks. All text atoms are split to form basic
50  /// block atoms, which then each back an MCBasicBlock.
51  MCModule *buildModule(bool withCFG = false);
52
53private:
54  /// \brief Fill \p Module by creating an atom for each section.
55  /// This could be made much smarter, using information like symbols, but also
56  /// format-specific features, like mach-o function_start or data_in_code LCs.
57  void buildSectionAtoms(MCModule *Module);
58
59  /// \brief Enrich \p Module with a CFG consisting of MCFunctions.
60  /// \param Module An MCModule returned by buildModule, with no CFG.
61  /// NOTE: Each MCBasicBlock in a MCFunction is backed by a single MCTextAtom.
62  /// When the CFG is built, contiguous instructions that were previously in a
63  /// single MCTextAtom will be split in multiple basic block atoms.
64  void buildCFG(MCModule *Module);
65};
66
67}
68
69#endif
70