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