LLVM  8.0.1
MCSectionCOFF.h
Go to the documentation of this file.
1 //===- MCSectionCOFF.h - COFF Machine Code Sections -------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares the MCSectionCOFF class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_MC_MCSECTIONCOFF_H
15 #define LLVM_MC_MCSECTIONCOFF_H
16 
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/MC/MCSection.h"
19 #include "llvm/MC/SectionKind.h"
20 #include <cassert>
21 
22 namespace llvm {
23 
24 class MCSymbol;
25 
26 /// This represents a section on Windows
27 class MCSectionCOFF final : public MCSection {
28  // The memory for this string is stored in the same MCContext as *this.
30 
31  // FIXME: The following fields should not be mutable, but are for now so the
32  // asm parser can honor the .linkonce directive.
33 
34  /// This is the Characteristics field of a section, drawn from the enums
35  /// below.
36  mutable unsigned Characteristics;
37 
38  /// The unique IDs used with the .pdata and .xdata sections created internally
39  /// by the assembler. This ID is used to ensure that for every .text section,
40  /// there is exactly one .pdata and one .xdata section, which is required by
41  /// the Microsoft incremental linker. This data is mutable because this ID is
42  /// not notionally part of the section.
43  mutable unsigned WinCFISectionID = ~0U;
44 
45  /// The COMDAT symbol of this section. Only valid if this is a COMDAT section.
46  /// Two COMDAT sections are merged if they have the same COMDAT symbol.
47  MCSymbol *COMDATSymbol;
48 
49  /// This is the Selection field for the section symbol, if it is a COMDAT
50  /// section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0
51  mutable int Selection;
52 
53 private:
54  friend class MCContext;
55  MCSectionCOFF(StringRef Section, unsigned Characteristics,
56  MCSymbol *COMDATSymbol, int Selection, SectionKind K,
57  MCSymbol *Begin)
58  : MCSection(SV_COFF, K, Begin), SectionName(Section),
59  Characteristics(Characteristics), COMDATSymbol(COMDATSymbol),
60  Selection(Selection) {
61  assert((Characteristics & 0x00F00000) == 0 &&
62  "alignment must not be set upon section creation");
63  }
64 
65 public:
67 
68  /// Decides whether a '.section' directive should be printed before the
69  /// section name
70  bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
71 
72  StringRef getSectionName() const { return SectionName; }
73  unsigned getCharacteristics() const { return Characteristics; }
74  MCSymbol *getCOMDATSymbol() const { return COMDATSymbol; }
75  int getSelection() const { return Selection; }
76 
77  void setSelection(int Selection) const;
78 
79  void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
80  raw_ostream &OS,
81  const MCExpr *Subsection) const override;
82  bool UseCodeAlign() const override;
83  bool isVirtualSection() const override;
84 
85  unsigned getOrAssignWinCFISectionID(unsigned *NextID) const {
86  if (WinCFISectionID == ~0U)
87  WinCFISectionID = (*NextID)++;
88  return WinCFISectionID;
89  }
90 
92  return Name.startswith(".debug");
93  }
94 
95  static bool classof(const MCSection *S) { return S->getVariant() == SV_COFF; }
96 };
97 
98 } // end namespace llvm
99 
100 #endif // LLVM_MC_MCSECTIONCOFF_H
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Definition: MCSection.h:39
This class represents lattice values for constants.
Definition: AllocatorList.h:24
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
void setSelection(int Selection) const
This represents a section on Windows.
Definition: MCSectionCOFF.h:27
amdgpu Simplify well known AMD library false Value Value const Twine & Name
unsigned getOrAssignWinCFISectionID(unsigned *NextID) const
Definition: MCSectionCOFF.h:85
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:36
bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const
Decides whether a &#39;.section&#39; directive should be printed before the section name. ...
bool isVirtualSection() const override
Check whether this section is "virtual", that is has no actual object file contents.
Context object for machine code objects.
Definition: MCContext.h:63
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition: StringRef.h:267
bool UseCodeAlign() const override
Return true if a .align directive should use "optimized nops" to fill instead of 0s.
unsigned getCharacteristics() const
Definition: MCSectionCOFF.h:73
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:23
SectionVariant getVariant() const
Definition: MCSection.h:108
StringRef getSectionName() const
Definition: MCSectionCOFF.h:72
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
MCSymbol * getCOMDATSymbol() const
Definition: MCSectionCOFF.h:74
int getSelection() const
Definition: MCSectionCOFF.h:75
amdgpu AMDGPU DAG DAG Pattern Instruction Selection
static bool classof(const MCSection *S)
Definition: MCSectionCOFF.h:95
void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T, raw_ostream &OS, const MCExpr *Subsection) const override
COFFYAML::WeakExternalCharacteristics Characteristics
Definition: COFFYAML.cpp:323
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isImplicitlyDiscardable(StringRef Name)
Definition: MCSectionCOFF.h:91
const char SectionName[]
Definition: AMDGPUPTNote.h:24
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49