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