MCSectionELF.h revision f1d0f7781e766df878bec4e7977fa3204374f394
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===- MCSectionELF.h - ELF Machine Code Sections ---------------*- C++ -*-===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//===----------------------------------------------------------------------===//
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This file declares the MCSectionELF class.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch//===----------------------------------------------------------------------===//
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_MC_MCSECTIONELF_H
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_MC_MCSECTIONELF_H
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "llvm/MC/MCSection.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "llvm/Support/ELF.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "llvm/ADT/StringRef.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace llvm {
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MCSymbol;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/// MCSectionELF - This represents a section on linux, lots of unix variants
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/// and some bare metal systems.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MCSectionELF : public MCSection {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// SectionName - This is the name of the section.  The referenced memory is
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// owned by TargetLoweringObjectFileELF's ELFUniqueMap.
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringRef SectionName;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// Type - This is the sh_type field of a section, drawn from the enums below.
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  unsigned Type;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// Flags - This is the sh_flags field of a section, drawn from the enums.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// below.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned Flags;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// EntrySize - The size of each entry in this section. This size only
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// makes sense for sections that contain fixed-sized entries. If a
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// section does not contain fixed-sized entries 'EntrySize' will be 0.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned EntrySize;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const MCSymbol *Group;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class MCContext;
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MCSectionELF(StringRef Section, unsigned type, unsigned flags,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               SectionKind K, unsigned entrySize, const MCSymbol *group)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : MCSection(SV_ELF, K), SectionName(Section), Type(type), Flags(flags),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EntrySize(entrySize), Group(group) {}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~MCSectionELF();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// ShouldOmitSectionDirective - Decides whether a '.section' directive
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// should be printed before the section name
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringRef getSectionName() const { return SectionName; }
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unsigned getType() const { return Type; }
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unsigned getFlags() const { return Flags; }
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unsigned getEntrySize() const { return EntrySize; }
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const MCSymbol *getGroup() const { return Group; }
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void PrintSwitchToSection(const MCAsmInfo &MAI,
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            raw_ostream &OS) const;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool UseCodeAlign() const;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool isVirtualSection() const;
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// isBaseAddressKnownZero - We know that non-allocatable sections (like
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// debug info) have a base of zero.
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool isBaseAddressKnownZero() const {
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return (getFlags() & ELF::SHF_ALLOC) == 0;
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static bool classof(const MCSection *S) {
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return S->getVariant() == SV_ELF;
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool classof(const MCSectionELF *) { return true; }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Return the entry size for sections with fixed-width data.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static unsigned DetermineEntrySize(SectionKind Kind);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // end namespace llvm
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)