1ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//===- MCSection.h - Machine Code Sections ----------------------*- C++ -*-===//
2ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//
3ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//                     The LLVM Compiler Infrastructure
4ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//
5ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// This file is distributed under the University of Illinois Open Source
6ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// License. See LICENSE.TXT for details.
7ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//
8ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//===----------------------------------------------------------------------===//
9a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner//
10a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner// This file declares the MCSection class.
11a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner//
12a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner//===----------------------------------------------------------------------===//
13ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar
14ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#ifndef LLVM_MC_MCSECTION_H
15ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#define LLVM_MC_MCSECTION_H
16ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar
17b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher#include "llvm/ADT/StringRef.h"
180064e85050e3a324aa66ee29af56546e0c31f6ccChris Lattner#include "llvm/MC/SectionKind.h"
191f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper#include "llvm/Support/Compiler.h"
20ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar
21ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattnernamespace llvm {
22af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  class MCAsmInfo;
23df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  class MCExpr;
24892e18239308f8a02a4c83758616be84a459c19dChris Lattner  class raw_ostream;
25dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
26a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  /// MCSection - Instances of this class represent a uniqued identifier for a
27a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  /// section in the current translation unit.  The MCContext class uniques and
28a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  /// creates these.
29ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar  class MCSection {
309a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar  public:
319a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    enum SectionVariant {
329a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar      SV_COFF = 0,
339a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar      SV_ELF,
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      SV_MachO
359a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    };
369a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar
379a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar  private:
381f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper    MCSection(const MCSection&) LLVM_DELETED_FUNCTION;
391f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper    void operator=(const MCSection&) LLVM_DELETED_FUNCTION;
40ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner  protected:
419a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    MCSection(SectionVariant V, SectionKind K) : Variant(V), Kind(K) {}
429a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    SectionVariant Variant;
43a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner    SectionKind Kind;
44a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  public:
45ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner    virtual ~MCSection();
46a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar
47a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner    SectionKind getKind() const { return Kind; }
489a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar
499a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    SectionVariant getVariant() const { return Variant; }
50dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
5133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner    virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
52df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                      raw_ostream &OS,
53df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                      const MCExpr *Subsection) const = 0;
543d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner
55b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher    // Convenience routines to get label names for the beginning/end of a
56b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher    // section.
57b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher    virtual std::string getLabelBeginName() const = 0;
58b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher    virtual std::string getLabelEndName() const = 0;
59b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher
60ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands    /// isBaseAddressKnownZero - Return true if we know that this section will
61ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands    /// get a base address of zero.  In cases where we know that this is true we
62ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands    /// can emit section offsets as direct references to avoid a subtraction
63ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands    /// from the base of the section, saving a relocation.
64ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands    virtual bool isBaseAddressKnownZero() const {
65ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands      return false;
66ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands    }
67ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands
68083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung    // UseCodeAlign - Return true if a .align directive should use
69083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung    // "optimized nops" to fill instead of 0s.
70083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung    virtual bool UseCodeAlign() const = 0;
71083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung
72f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    /// isVirtualSection - Check whether this section is "virtual", that is
73f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    /// has no actual object file contents.
74f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola    virtual bool isVirtualSection() const = 0;
75ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar  };
76dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
77ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar} // end namespace llvm
78ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar
79ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#endif
80