MCSection.h revision dd2ad8432f104282ff43c94457f474ea0a264175
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
17ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#include <string>
18b5261ebabb215330d6549048b825d236fb3c9b6bDaniel Dunbar#include "llvm/ADT/StringRef.h"
190064e85050e3a324aa66ee29af56546e0c31f6ccChris Lattner#include "llvm/MC/SectionKind.h"
209a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar#include "llvm/Support/Casting.h"
21ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar
22ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattnernamespace llvm {
23ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner  class MCContext;
24af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner  class MCAsmInfo;
25892e18239308f8a02a4c83758616be84a459c19dChris Lattner  class raw_ostream;
26dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
27a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  /// MCSection - Instances of this class represent a uniqued identifier for a
28a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  /// section in the current translation unit.  The MCContext class uniques and
29a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  /// creates these.
30ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar  class MCSection {
319a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar  public:
329a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    enum SectionVariant {
339a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar      SV_COFF = 0,
349a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar      SV_ELF,
359a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar      SV_MachO,
369a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar      SV_PIC16
379a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    };
389a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar
399a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar  private:
40a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner    MCSection(const MCSection&);      // DO NOT IMPLEMENT
41a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner    void operator=(const MCSection&); // DO NOT IMPLEMENT
42ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner  protected:
439a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    MCSection(SectionVariant V, SectionKind K) : Variant(V), Kind(K) {}
449a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    SectionVariant Variant;
45a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner    SectionKind Kind;
46a0faf7ae555eacf75f5a482968b27e447d71c99fChris Lattner  public:
47ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner    virtual ~MCSection();
48a11af531ec48ad84f790b9511f003ac5c934a999Daniel Dunbar
49a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner    SectionKind getKind() const { return Kind; }
509a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar
519a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    SectionVariant getVariant() const { return Variant; }
52dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
5333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner    virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
54892e18239308f8a02a4c83758616be84a459c19dChris Lattner                                      raw_ostream &OS) const = 0;
553d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner
563d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner    /// isBaseAddressKnownZero - Return true if we know that this section will
573d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner    /// get a base address of zero.  In cases where we know that this is true we
583d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner    /// can emit section offsets as direct references to avoid a subtraction
593d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner    /// from the base of the section, saving a relocation.
603d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner    virtual bool isBaseAddressKnownZero() const {
613d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner      return false;
623d2251361171b1a41bdb2ac71882e69d48617f49Chris Lattner    }
639a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar
649a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar    static bool classof(const MCSection *) { return true; }
65ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar  };
66dd2ad8432f104282ff43c94457f474ea0a264175Mikhail Glushenkov
67ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar} // end namespace llvm
68ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar
69ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#endif
70