LLVM  16.0.0git
MCSectionXCOFF.h
Go to the documentation of this file.
1 //===- MCSectionXCOFF.h - XCOFF Machine Code Sections -----------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file declares the MCSectionXCOFF class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_MC_MCSECTIONXCOFF_H
14 #define LLVM_MC_MCSECTIONXCOFF_H
15 
17 #include "llvm/MC/MCSection.h"
18 #include "llvm/MC/MCSymbolXCOFF.h"
19 
20 namespace llvm {
21 
22 // This class represents an XCOFF `Control Section`, more commonly referred to
23 // as a csect. A csect represents the smallest possible unit of data/code which
24 // will be relocated as a single block. A csect can either be:
25 // 1) Initialized: The Type will be XTY_SD, and the symbols inside the csect
26 // will have a label definition representing their offset within the csect.
27 // 2) Uninitialized: The Type will be XTY_CM, it will contain a single symbol,
28 // and may not contain label definitions.
29 // 3) An external reference providing a symbol table entry for a symbol
30 // contained in another XCOFF object file. External reference csects are not
31 // implemented yet.
32 class MCSectionXCOFF final : public MCSection {
33  friend class MCContext;
34 
36  MCSymbolXCOFF *const QualName;
37  StringRef SymbolTableName;
39  bool MultiSymbolsAllowed;
40  static constexpr unsigned DefaultAlignVal = 4;
41  static constexpr unsigned DefaultTextAlignVal = 32;
42 
45  MCSymbol *Begin, StringRef SymbolTableName,
46  bool MultiSymbolsAllowed)
47  : MCSection(SV_XCOFF, Name, K, Begin),
48  CsectProp(XCOFF::CsectProperties(SMC, ST)), QualName(QualName),
49  SymbolTableName(SymbolTableName), DwarfSubtypeFlags(None),
50  MultiSymbolsAllowed(MultiSymbolsAllowed) {
51  assert(
52  (ST == XCOFF::XTY_SD || ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) &&
53  "Invalid or unhandled type for csect.");
54  assert(QualName != nullptr && "QualName is needed.");
55  if (SMC == XCOFF::XMC_UL)
56  assert((ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) &&
57  "Invalid csect type for storage mapping class XCOFF::XMC_UL");
58 
59  QualName->setRepresentedCsect(this);
61  if (ST != XCOFF::XTY_ER) {
62  // For a csect for program code, set the alignment to 32 bytes by default.
63  // For other csects, set the alignment to 4 bytes by default.
64  if (SMC == XCOFF::XMC_PR)
65  setAlignment(Align(DefaultTextAlignVal));
66  else
67  setAlignment(Align(DefaultAlignVal));
68  }
69  }
70 
71  MCSectionXCOFF(StringRef Name, SectionKind K, MCSymbolXCOFF *QualName,
72  XCOFF::DwarfSectionSubtypeFlags DwarfSubtypeFlags,
73  MCSymbol *Begin, StringRef SymbolTableName,
74  bool MultiSymbolsAllowed)
75  : MCSection(SV_XCOFF, Name, K, Begin), QualName(QualName),
76  SymbolTableName(SymbolTableName), DwarfSubtypeFlags(DwarfSubtypeFlags),
77  MultiSymbolsAllowed(MultiSymbolsAllowed) {
78  assert(QualName != nullptr && "QualName is needed.");
79 
80  // FIXME: use a more meaningful name for non csect sections.
81  QualName->setRepresentedCsect(this);
82 
83  // Use default text alignment as the alignment for DWARF sections.
84  setAlignment(Align(DefaultTextAlignVal));
85  }
86 
87  void printCsectDirective(raw_ostream &OS) const;
88 
89 public:
91 
92  static bool classof(const MCSection *S) {
93  return S->getVariant() == SV_XCOFF;
94  }
95 
97  assert(isCsect() && "Only csect section has mapping class property!");
98  return CsectProp->MappingClass;
99  }
101  return QualName->getStorageClass();
102  }
104  return QualName->getVisibilityType();
105  }
107  assert(isCsect() && "Only csect section has symbol type property!");
108  return CsectProp->Type;
109  }
110  MCSymbolXCOFF *getQualNameSymbol() const { return QualName; }
111 
112  void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
113  raw_ostream &OS,
114  const MCExpr *Subsection) const override;
115  bool useCodeAlign() const override;
116  bool isVirtualSection() const override;
117  StringRef getSymbolTableName() const { return SymbolTableName; }
118  bool isMultiSymbolsAllowed() const { return MultiSymbolsAllowed; }
119  bool isCsect() const { return CsectProp.has_value(); }
120  bool isDwarfSect() const { return DwarfSubtypeFlags.has_value(); }
122  return DwarfSubtypeFlags;
123  }
124  Optional<XCOFF::CsectProperties> getCsectProp() const { return CsectProp; }
125 };
126 
127 } // end namespace llvm
128 
129 #endif
llvm::MCSectionXCOFF::getCSectType
XCOFF::SymbolType getCSectType() const
Definition: MCSectionXCOFF.h:106
llvm::MCSection::Name
StringRef Name
Definition: MCSection.h:113
llvm::XCOFF::XTY_ER
@ XTY_ER
External reference.
Definition: XCOFF.h:228
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
llvm::MCSectionXCOFF
Definition: MCSectionXCOFF.h:32
llvm::XCOFF::DwarfSectionSubtypeFlags
DwarfSectionSubtypeFlags
Values for defining the section subtype of sections of type STYP_DWARF as they would appear in the (s...
Definition: XCOFF.h:141
llvm::MCContext
Context object for machine code objects.
Definition: MCContext.h:76
llvm::MCSectionXCOFF::classof
static bool classof(const MCSection *S)
Definition: MCSectionXCOFF.h:92
llvm::MCSection::SV_XCOFF
@ SV_XCOFF
Definition: MCSection.h:49
llvm::MCAsmInfo
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
llvm::XCOFF::VisibilityType
VisibilityType
Values for visibility as they would appear when encoded in the high 4 bits of the 16-bit unsigned n_t...
Definition: XCOFF.h:238
llvm::XCOFF::SymbolType
SymbolType
Definition: XCOFF.h:227
llvm::XCOFF::XMC_PR
@ XMC_PR
Program Code.
Definition: XCOFF.h:92
llvm::MCSectionXCOFF::isVirtualSection
bool isVirtualSection() const override
Check whether this section is "virtual", that is has no actual object file contents.
Definition: MCSectionXCOFF.cpp:123
llvm::Triple
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
llvm::MCSectionXCOFF::isCsect
bool isCsect() const
Definition: MCSectionXCOFF.h:119
llvm::Optional
Definition: APInt.h:33
T
#define T
Definition: Mips16ISelLowering.cpp:341
llvm::MCSymbolXCOFF::setRepresentedCsect
void setRepresentedCsect(MCSectionXCOFF *C)
Definition: MCSymbolXCOFF.cpp:22
llvm::MCSection::MCSection
MCSection(SectionVariant V, StringRef Name, SectionKind K, MCSymbol *Begin)
Definition: MCSection.cpp:23
llvm::MCSectionXCOFF::useCodeAlign
bool useCodeAlign() const override
Return true if a .align directive should use "optimized nops" to fill instead of 0s.
Definition: MCSectionXCOFF.cpp:121
llvm::XCOFF::CsectProperties
Definition: XCOFF.h:458
XCOFF.h
llvm::MCSectionXCOFF::isMultiSymbolsAllowed
bool isMultiSymbolsAllowed() const
Definition: MCSectionXCOFF.h:118
llvm::MCSectionXCOFF::getStorageClass
XCOFF::StorageClass getStorageClass() const
Definition: MCSectionXCOFF.h:100
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
llvm::MCSectionXCOFF::getMappingClass
XCOFF::StorageMappingClass getMappingClass() const
Definition: MCSectionXCOFF.h:96
Align
uint64_t Align
Definition: ELFObjHandler.cpp:82
llvm::XCOFF::XTY_SD
@ XTY_SD
Csect definition for initialized storage.
Definition: XCOFF.h:229
llvm::XCOFF::StorageMappingClass
StorageMappingClass
Storage Mapping Class definitions.
Definition: XCOFF.h:90
llvm::MCSymbolXCOFF::setStorageClass
void setStorageClass(XCOFF::StorageClass SC)
Definition: MCSymbolXCOFF.h:37
llvm::XCOFF::StorageClass
StorageClass
Definition: XCOFF.h:157
llvm::XCOFF::XTY_CM
@ XTY_CM
Common csect definition. For uninitialized storage.
Definition: XCOFF.h:232
llvm::ARM_MB::ST
@ ST
Definition: ARMBaseInfo.h:73
MCSymbolXCOFF.h
llvm::XCOFF::C_HIDEXT
@ C_HIDEXT
Definition: XCOFF.h:193
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
MCSection.h
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
llvm::MCSection
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:39
S
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
Definition: README.txt:210
llvm::Optional::has_value
constexpr bool has_value() const
Definition: Optional.h:285
llvm::MCSection::setAlignment
void setAlignment(Align Value)
Definition: MCSection.h:141
llvm::MCSectionXCOFF::isDwarfSect
bool isDwarfSect() const
Definition: MCSectionXCOFF.h:120
llvm::MCSectionXCOFF::~MCSectionXCOFF
~MCSectionXCOFF()
llvm::SectionKind
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:22
llvm::None
constexpr std::nullopt_t None
Definition: None.h:27
llvm::MCSymbolXCOFF
Definition: MCSymbolXCOFF.h:20
llvm::MCSectionXCOFF::getVisibilityType
XCOFF::VisibilityType getVisibilityType() const
Definition: MCSectionXCOFF.h:103
llvm::MCSectionXCOFF::getQualNameSymbol
MCSymbolXCOFF * getQualNameSymbol() const
Definition: MCSectionXCOFF.h:110
llvm::MCSectionXCOFF::getSymbolTableName
StringRef getSymbolTableName() const
Definition: MCSectionXCOFF.h:117
llvm::MCSectionXCOFF::getCsectProp
Optional< XCOFF::CsectProperties > getCsectProp() const
Definition: MCSectionXCOFF.h:124
llvm::MCSectionXCOFF::getDwarfSubtypeFlags
Optional< XCOFF::DwarfSectionSubtypeFlags > getDwarfSubtypeFlags() const
Definition: MCSectionXCOFF.h:121
llvm::XCOFF::XMC_UL
@ XMC_UL
Uninitialized thread-local variable.
Definition: XCOFF.h:114
llvm::MCSectionXCOFF::printSwitchToSection
void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, raw_ostream &OS, const MCExpr *Subsection) const override
Definition: MCSectionXCOFF.cpp:26
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
llvm::ISD::MCSymbol
@ MCSymbol
Definition: ISDOpcodes.h:172