1124e1821033a4b3220f552229652d9460ed90673Owen Anderson//===-- llvm/MC/MCModule.h - MCModule class ---------------------*- C++ -*-===//
2124e1821033a4b3220f552229652d9460ed90673Owen Anderson//
3124e1821033a4b3220f552229652d9460ed90673Owen Anderson//                     The LLVM Compiler Infrastructure
4124e1821033a4b3220f552229652d9460ed90673Owen Anderson//
5124e1821033a4b3220f552229652d9460ed90673Owen Anderson// This file is distributed under the University of Illinois Open Source
6124e1821033a4b3220f552229652d9460ed90673Owen Anderson// License. See LICENSE.TXT for details.
7124e1821033a4b3220f552229652d9460ed90673Owen Anderson//
8124e1821033a4b3220f552229652d9460ed90673Owen Anderson//===----------------------------------------------------------------------===//
9124e1821033a4b3220f552229652d9460ed90673Owen Anderson//
10124e1821033a4b3220f552229652d9460ed90673Owen Anderson// This file contains the declaration of the MCModule class, which is used to
11124e1821033a4b3220f552229652d9460ed90673Owen Anderson// represent a complete, disassembled object file or executable.
12124e1821033a4b3220f552229652d9460ed90673Owen Anderson//
13124e1821033a4b3220f552229652d9460ed90673Owen Anderson//===----------------------------------------------------------------------===//
14124e1821033a4b3220f552229652d9460ed90673Owen Anderson
15124e1821033a4b3220f552229652d9460ed90673Owen Anderson#ifndef LLVM_MC_MCMODULE_H
16124e1821033a4b3220f552229652d9460ed90673Owen Anderson#define LLVM_MC_MCMODULE_H
17124e1821033a4b3220f552229652d9460ed90673Owen Anderson
18124e1821033a4b3220f552229652d9460ed90673Owen Anderson#include "llvm/ADT/DenseMap.h"
19124e1821033a4b3220f552229652d9460ed90673Owen Anderson#include "llvm/ADT/IntervalMap.h"
20124e1821033a4b3220f552229652d9460ed90673Owen Anderson#include "llvm/ADT/SmallPtrSet.h"
21124e1821033a4b3220f552229652d9460ed90673Owen Anderson#include "llvm/Support/DataTypes.h"
22124e1821033a4b3220f552229652d9460ed90673Owen Anderson
23124e1821033a4b3220f552229652d9460ed90673Owen Andersonnamespace llvm {
24124e1821033a4b3220f552229652d9460ed90673Owen Anderson
25124e1821033a4b3220f552229652d9460ed90673Owen Andersonclass MCAtom;
26124e1821033a4b3220f552229652d9460ed90673Owen Anderson
27124e1821033a4b3220f552229652d9460ed90673Owen Anderson/// MCModule - This class represent a completely disassembled object file or
28124e1821033a4b3220f552229652d9460ed90673Owen Anderson/// executable.  It comprises a list of MCAtom's, and a branch target table.
29124e1821033a4b3220f552229652d9460ed90673Owen Anderson/// Each atom represents a contiguous range of either instructions or data.
30124e1821033a4b3220f552229652d9460ed90673Owen Andersonclass MCModule {
31124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// AtomAllocationTracker - An MCModule owns its component MCAtom's, so it
32124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// must track them in order to ensure they are properly freed as atoms are
33124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// merged or otherwise manipulated.
34124e1821033a4b3220f552229652d9460ed90673Owen Anderson  SmallPtrSet<MCAtom*, 8> AtomAllocationTracker;
35124e1821033a4b3220f552229652d9460ed90673Owen Anderson
36124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// OffsetMap - Efficiently maps offset ranges to MCAtom's.
37124e1821033a4b3220f552229652d9460ed90673Owen Anderson  IntervalMap<uint64_t, MCAtom*> OffsetMap;
38124e1821033a4b3220f552229652d9460ed90673Owen Anderson
39124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// BranchTargetMap - Maps offsets that are determined to be branches and
40124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// can be statically resolved to their target offsets.
41124e1821033a4b3220f552229652d9460ed90673Owen Anderson  DenseMap<uint64_t, MCAtom*> BranchTargetMap;
42124e1821033a4b3220f552229652d9460ed90673Owen Anderson
43124e1821033a4b3220f552229652d9460ed90673Owen Anderson  friend class MCAtom;
44124e1821033a4b3220f552229652d9460ed90673Owen Anderson
45124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// remap - Update the interval mapping for an MCAtom.
46124e1821033a4b3220f552229652d9460ed90673Owen Anderson  void remap(MCAtom *Atom, uint64_t NewBegin, uint64_t NewEnd);
47124e1821033a4b3220f552229652d9460ed90673Owen Anderson
48124e1821033a4b3220f552229652d9460ed90673Owen Andersonpublic:
49124e1821033a4b3220f552229652d9460ed90673Owen Anderson  MCModule(IntervalMap<uint64_t, MCAtom*>::Allocator &A) : OffsetMap(A) { }
50124e1821033a4b3220f552229652d9460ed90673Owen Anderson
51124e1821033a4b3220f552229652d9460ed90673Owen Anderson  /// createAtom - Creates a new MCAtom covering the specified offset range.
52124e1821033a4b3220f552229652d9460ed90673Owen Anderson  MCAtom *createAtom(MCAtom::AtomType Type, uint64_t Begin, uint64_t End);
53124e1821033a4b3220f552229652d9460ed90673Owen Anderson};
54124e1821033a4b3220f552229652d9460ed90673Owen Anderson
55124e1821033a4b3220f552229652d9460ed90673Owen Anderson}
56124e1821033a4b3220f552229652d9460ed90673Owen Anderson
57124e1821033a4b3220f552229652d9460ed90673Owen Anderson#endif
58124e1821033a4b3220f552229652d9460ed90673Owen Anderson
59