1eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner//===- MCSectionCOFF.h - COFF Machine Code Sections -------------*- C++ -*-===// 2eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 3eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// The LLVM Compiler Infrastructure 4eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 5eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// This file is distributed under the University of Illinois Open Source 6eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// License. See LICENSE.TXT for details. 7eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 8eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner//===----------------------------------------------------------------------===// 9eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 10eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// This file declares the MCSectionCOFF class. 11eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner// 12eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner//===----------------------------------------------------------------------===// 13eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 14eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#ifndef LLVM_MC_MCSECTIONCOFF_H 15eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#define LLVM_MC_MCSECTIONCOFF_H 16eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 17255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/StringRef.h" 18eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSection.h" 1994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar#include "llvm/Support/COFF.h" 2094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar 21eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnernamespace llvm { 220ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendlingclass MCSymbol; 234778643912832bc8118eace1aee16554117a8eefMichael J. Spencer 24eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner/// MCSectionCOFF - This represents a section on Windows 25eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner class MCSectionCOFF : public MCSection { 26eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner // The memory for this string is stored in the same MCContext as *this. 27eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner StringRef SectionName; 284778643912832bc8118eace1aee16554117a8eefMichael J. Spencer 2980646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck // FIXME: The following fields should not be mutable, but are for now so 3080646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck // the asm parser can honor the .linkonce directive. 3180646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck 326e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner /// Characteristics - This is the Characteristics field of a section, 3380646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck /// drawn from the enums below. 3480646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck mutable unsigned Characteristics; 356e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner 360ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling /// The COMDAT symbol of this section. Only valid if this is a COMDAT 370ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling /// section. Two COMDAT sections are merged if they have the same 380ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling /// COMDAT symbol. 390ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling const MCSymbol *COMDATSymbol; 400ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling 416e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner /// Selection - This is the Selection field for the section symbol, if 426e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner /// it is a COMDAT section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0 4380646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck mutable int Selection; 4480646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck 45eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner private: 46eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner friend class MCContext; 476e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner MCSectionCOFF(StringRef Section, unsigned Characteristics, 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const MCSymbol *COMDATSymbol, int Selection, SectionKind K) 490ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling : MCSection(SV_COFF, K), SectionName(Section), 500ae07098f7d2ad5a1868d448d0b1b4eef2a3b091Bill Wendling Characteristics(Characteristics), COMDATSymbol(COMDATSymbol), 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Selection(Selection) { 526e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner assert ((Characteristics & 0x00F00000) == 0 && 536e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner "alignment must not be set upon section creation"); 54eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner } 55eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner ~MCSectionCOFF(); 56eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 57eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner public: 58eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner /// ShouldOmitSectionDirective - Decides whether a '.section' directive 59eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner /// should be printed before the section name 60eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const; 61eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 62eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner StringRef getSectionName() const { return SectionName; } 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getLabelBeginName() const override { 64b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher return SectionName.str() + "_begin"; 65b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher } 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getLabelEndName() const override { 67b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher return SectionName.str() + "_end"; 68b1cc6f3dff96bfb26e0f5b62a187374b6a7629a1Eric Christopher } 696e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner unsigned getCharacteristics() const { return Characteristics; } 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const MCSymbol *getCOMDATSymbol() const { return COMDATSymbol; } 7180646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck int getSelection() const { return Selection; } 7280646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void setSelection(int Selection) const; 744778643912832bc8118eace1aee16554117a8eefMichael J. Spencer 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Subsection) const override; 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool UseCodeAlign() const override; 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isVirtualSection() const override; 799a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar 809a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar static bool classof(const MCSection *S) { 819a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar return S->getVariant() == SV_COFF; 829a744e38607bc3046dffea56efec0b2dfc51d5e4Daniel Dunbar } 83eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner }; 84eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 85eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner} // end namespace llvm 86eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 87eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#endif 88