f7f32aed6ff8ddcdb819679092cf07cd2860e48d
[oota-llvm.git] / include / llvm / MC / MCAsmLayout.h
1 //===- MCAsmLayout.h - Assembly Layout Object -------------------*- 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 #ifndef LLVM_MC_MCASMLAYOUT_H
11 #define LLVM_MC_MCASMLAYOUT_H
12
13 namespace llvm {
14 class MCAssembler;
15 class MCFragment;
16 class MCSectionData;
17 class MCSymbolData;
18
19 /// Encapsulates the layout of an assembly file at a particular point in time.
20 ///
21 /// Assembly may requiring compute multiple layouts for a particular assembly
22 /// file as part of the relaxation process. This class encapsulates the layout
23 /// at a single point in time in such a way that it is always possible to
24 /// efficiently compute the exact addresses of any symbol in the assembly file,
25 /// even during the relaxation process.
26 class MCAsmLayout {
27 private:
28   MCAssembler &Assembler;
29
30 public:
31   MCAsmLayout(MCAssembler &_Assembler) : Assembler(_Assembler) {}
32
33   /// Get the assembler object this is a layout for.
34   MCAssembler &getAssembler() const { return Assembler; }
35
36   /// @name Fragment Layout Data
37   /// @{
38
39   /// \brief Get the effective size of the given fragment, as computed in the
40   /// current layout.
41   uint64_t getFragmentEffectiveSize(const MCFragment *F) const;
42
43   /// \brief Set the effective size of the given fragment.
44   void setFragmentEffectiveSize(MCFragment *F, uint64_t Value);
45
46   /// \brief Get the offset of the given fragment inside its containing section.
47   uint64_t getFragmentOffset(const MCFragment *F) const;
48
49   /// \brief Set the offset of the given fragment inside its containing section.
50   void setFragmentOffset(MCFragment *F, uint64_t Value);
51
52   /// @}
53   /// @name Section Layout Data
54   /// @{
55
56   /// \brief Get the computed address of the given section.
57   uint64_t getSectionAddress(const MCSectionData *SD) const;
58
59   /// \brief Set the computed address of the given section.
60   void setSectionAddress(MCSectionData *SD, uint64_t Value);
61
62   /// \brief Get the data size of the given section, as emitted to the object
63   /// file. This may include additional padding, or be 0 for virtual sections.
64   uint64_t getSectionFileSize(const MCSectionData *SD) const;
65
66   /// \brief Set the data size of the given section.
67   void setSectionFileSize(MCSectionData *SD, uint64_t Value);
68
69   /// \brief Get the actual data size of the given section.
70   uint64_t getSectionSize(const MCSectionData *SD) const;
71
72   /// \brief Set the actual data size of the given section.
73   void setSectionSize(MCSectionData *SD, uint64_t Value);
74
75   /// @}
76   /// @name Utility Functions
77   /// @{
78
79   /// \brief Get the address of the given fragment, as computed in the current
80   /// layout.
81   uint64_t getFragmentAddress(const MCFragment *F) const;
82
83   /// \brief Get the address of the given symbol, as computed in the current
84   /// layout.
85   uint64_t getSymbolAddress(const MCSymbolData *SD) const;
86
87   /// @}
88 };
89
90 } // end namespace llvm
91
92 #endif