MCAsmLayout.h revision d13a0caf726e05c9bd939d752ef371d6d467ef28
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#include "llvm/ADT/SmallVector.h" 14 15namespace llvm { 16class MCAssembler; 17class MCFragment; 18class MCSectionData; 19class MCSymbolData; 20 21/// Encapsulates the layout of an assembly file at a particular point in time. 22/// 23/// Assembly may requiring compute multiple layouts for a particular assembly 24/// file as part of the relaxation process. This class encapsulates the layout 25/// at a single point in time in such a way that it is always possible to 26/// efficiently compute the exact addresses of any symbol in the assembly file, 27/// even during the relaxation process. 28class MCAsmLayout { 29public: 30 typedef llvm::SmallVectorImpl<MCSectionData*>::const_iterator const_iterator; 31 typedef llvm::SmallVectorImpl<MCSectionData*>::iterator iterator; 32 33private: 34 MCAssembler &Assembler; 35 36 /// List of sections in layout order. 37 llvm::SmallVector<MCSectionData*, 16> SectionOrder; 38 39public: 40 MCAsmLayout(MCAssembler &_Assembler); 41 42 /// Get the assembler object this is a layout for. 43 MCAssembler &getAssembler() const { return Assembler; } 44 45 /// \brief Update the layout because a fragment has been resized. The 46 /// fragments size should have already been updated, the \arg SlideAmount is 47 /// the delta from the old size. 48 void UpdateForSlide(MCFragment *F, int SlideAmount); 49 50 /// @name Section Access (in layout order) 51 /// @{ 52 53 llvm::SmallVectorImpl<MCSectionData*> &getSectionOrder() { 54 return SectionOrder; 55 } 56 const llvm::SmallVectorImpl<MCSectionData*> &getSectionOrder() const { 57 return SectionOrder; 58 } 59 60 /// @} 61 /// @name Fragment Layout Data 62 /// @{ 63 64 /// \brief Get the effective size of the given fragment, as computed in the 65 /// current layout. 66 uint64_t getFragmentEffectiveSize(const MCFragment *F) const; 67 68 /// \brief Set the effective size of the given fragment. 69 void setFragmentEffectiveSize(MCFragment *F, uint64_t Value); 70 71 /// \brief Get the offset of the given fragment inside its containing section. 72 uint64_t getFragmentOffset(const MCFragment *F) const; 73 74 /// \brief Set the offset of the given fragment inside its containing section. 75 void setFragmentOffset(MCFragment *F, uint64_t Value); 76 77 /// @} 78 /// @name Section Layout Data 79 /// @{ 80 81 /// \brief Get the computed address of the given section. 82 uint64_t getSectionAddress(const MCSectionData *SD) const; 83 84 /// \brief Set the computed address of the given section. 85 void setSectionAddress(MCSectionData *SD, uint64_t Value); 86 87 /// \brief Get the data size of the given section, as emitted to the object 88 /// file. This may include additional padding, or be 0 for virtual sections. 89 uint64_t getSectionFileSize(const MCSectionData *SD) const; 90 91 /// \brief Set the data size of the given section. 92 void setSectionFileSize(MCSectionData *SD, uint64_t Value); 93 94 /// \brief Get the actual data size of the given section. 95 uint64_t getSectionSize(const MCSectionData *SD) const; 96 97 /// \brief Set the actual data size of the given section. 98 void setSectionSize(MCSectionData *SD, uint64_t Value); 99 100 /// @} 101 /// @name Utility Functions 102 /// @{ 103 104 /// \brief Get the address of the given fragment, as computed in the current 105 /// layout. 106 uint64_t getFragmentAddress(const MCFragment *F) const; 107 108 /// \brief Get the address of the given symbol, as computed in the current 109 /// layout. 110 uint64_t getSymbolAddress(const MCSymbolData *SD) const; 111 112 /// @} 113}; 114 115} // end namespace llvm 116 117#endif 118