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