MCSectionCOFF.h revision 0ae07098f7d2ad5a1868d448d0b1b4eef2a3b091
19166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//===- MCSectionCOFF.h - COFF Machine Code Sections -------------*- C++ -*-===//
29166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//
39166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//                     The LLVM Compiler Infrastructure
49166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//
59166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com// This file is distributed under the University of Illinois Open Source
69166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com// License. See LICENSE.TXT for details.
79166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//
89166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//===----------------------------------------------------------------------===//
99166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//
109166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com// This file declares the MCSectionCOFF class.
119166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//
129166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com//===----------------------------------------------------------------------===//
139166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
149166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#ifndef LLVM_MC_MCSECTIONCOFF_H
159166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#define LLVM_MC_MCSECTIONCOFF_H
169166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
179166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#include "llvm/ADT/StringRef.h"
189166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#include "llvm/MC/MCSection.h"
199166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#include "llvm/Support/COFF.h"
208d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com
219166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.comnamespace llvm {
22d892bd8ba676d34d4ce4a73ac7aad88e102fad70caryclark@google.comclass MCSymbol;
239166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
24cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com/// MCSectionCOFF - This represents a section on Windows
259166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com  class MCSectionCOFF : public MCSection {
269166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    // The memory for this string is stored in the same MCContext as *this.
279166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    StringRef SectionName;
289166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
299166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    // FIXME: The following fields should not be mutable, but are for now so
309166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    // the asm parser can honor the .linkonce directive.
319166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
329166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// Characteristics - This is the Characteristics field of a section,
339166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// drawn from the enums below.
349166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    mutable unsigned Characteristics;
359166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
368d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com    /// The COMDAT symbol of this section. Only valid if this is a COMDAT
379166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// section. Two COMDAT sections are merged if they have the same
389166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// COMDAT symbol.
39d892bd8ba676d34d4ce4a73ac7aad88e102fad70caryclark@google.com    const MCSymbol *COMDATSymbol;
409166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
41cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    /// Selection - This is the Selection field for the section symbol, if
429166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// it is a COMDAT section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0
439166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    mutable int Selection;
449166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
45cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    /// Assoc - This is name of the associated section, if it is a COMDAT
469166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0 with an
479166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// associative Selection (IMAGE_COMDAT_SELECT_ASSOCIATIVE).
489166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    mutable const MCSectionCOFF *Assoc;
499166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
509166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com  private:
519166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    friend class MCContext;
529166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    MCSectionCOFF(StringRef Section, unsigned Characteristics,
539166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                  const MCSymbol *COMDATSymbol, int Selection,
548d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com                  const MCSectionCOFF *Assoc, SectionKind K)
559166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        : MCSection(SV_COFF, K), SectionName(Section),
56d892bd8ba676d34d4ce4a73ac7aad88e102fad70caryclark@google.com          Characteristics(Characteristics), COMDATSymbol(COMDATSymbol),
579166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com          Selection(Selection), Assoc(Assoc) {
589166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com      assert ((Characteristics & 0x00F00000) == 0 &&
599166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        "alignment must not be set upon section creation");
609166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com      assert ((Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) ==
619166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com              (Assoc != 0) &&
629166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com        "associative COMDAT section must have an associated section");
639166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    }
649166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    ~MCSectionCOFF();
659166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
669166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com  public:
679166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// ShouldOmitSectionDirective - Decides whether a '.section' directive
689166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    /// should be printed before the section name
699166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
709166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
719166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    StringRef getSectionName() const { return SectionName; }
729166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    virtual std::string getLabelBeginName() const {
739166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com      return SectionName.str() + "_begin";
749166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    }
759166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    virtual std::string getLabelEndName() const {
769166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com      return SectionName.str() + "_end";
778d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com    }
789166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    unsigned getCharacteristics() const { return Characteristics; }
79d892bd8ba676d34d4ce4a73ac7aad88e102fad70caryclark@google.com    int getSelection() const { return Selection; }
809166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    const MCSectionCOFF *getAssocSection() const { return Assoc; }
819166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
829166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    void setSelection(int Selection, const MCSectionCOFF *Assoc = 0) const;
839166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
849166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
859166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                                      raw_ostream &OS,
869166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com                                      const MCExpr *Subsection) const;
879166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    virtual bool UseCodeAlign() const;
889166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    virtual bool isVirtualSection() const;
899166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
909166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    static bool classof(const MCSection *S) {
919166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com      return S->getVariant() == SV_COFF;
929166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com    }
939166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com  };
949166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com
959166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com} // end namespace llvm
9678e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.org
979166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com#endif
989166dcb3a0e8784bea83d76ae01aa338c049ae05caryclark@google.com