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)