xref: /freebsd/contrib/llvm-project/llvm/include/llvm/MC/MCSectionWasm.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===- MCSectionWasm.h - Wasm 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 MCSectionWasm class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_MC_MCSECTIONWASM_H
14 #define LLVM_MC_MCSECTIONWASM_H
15 
16 #include "llvm/MC/MCSection.h"
17 
18 namespace llvm {
19 
20 class MCSymbol;
21 class MCSymbolWasm;
22 class StringRef;
23 class raw_ostream;
24 
25 /// This represents a section on wasm.
26 class MCSectionWasm final : public MCSection {
27   unsigned UniqueID;
28 
29   const MCSymbolWasm *Group;
30 
31   // The offset of the MC function/data section in the wasm code/data section.
32   // For data relocations the offset is relative to start of the data payload
33   // itself and does not include the size of the section header.
34   uint64_t SectionOffset = 0;
35 
36   // For data sections, this is the index of the corresponding wasm data
37   // segment
38   uint32_t SegmentIndex = 0;
39 
40   // For data sections, whether to use a passive segment
41   bool IsPassive = false;
42 
43   bool IsWasmData;
44 
45   bool IsMetadata;
46 
47   // For data sections, bitfield of WasmSegmentFlag
48   unsigned SegmentFlags;
49 
50   // The storage of Name is owned by MCContext's WasmUniquingMap.
51   friend class MCContext;
MCSectionWasm(StringRef Name,SectionKind K,unsigned SegmentFlags,const MCSymbolWasm * Group,unsigned UniqueID,MCSymbol * Begin)52   MCSectionWasm(StringRef Name, SectionKind K, unsigned SegmentFlags,
53                 const MCSymbolWasm *Group, unsigned UniqueID, MCSymbol *Begin)
54       : MCSection(SV_Wasm, Name, K.isText(), /*IsVirtual=*/false, Begin),
55         UniqueID(UniqueID), Group(Group),
56         IsWasmData(K.isReadOnly() || K.isWriteable()),
57         IsMetadata(K.isMetadata()), SegmentFlags(SegmentFlags) {}
58 
59 public:
60   /// Decides whether a '.section' directive should be printed before the
61   /// section name
62   bool shouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
63 
getGroup()64   const MCSymbolWasm *getGroup() const { return Group; }
getSegmentFlags()65   unsigned getSegmentFlags() const { return SegmentFlags; }
66 
67   void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
68                             raw_ostream &OS,
69                             uint32_t Subsection) const override;
70   bool useCodeAlign() const override;
71 
isWasmData()72   bool isWasmData() const { return IsWasmData; }
isMetadata()73   bool isMetadata() const { return IsMetadata; }
74 
isUnique()75   bool isUnique() const { return UniqueID != ~0U; }
getUniqueID()76   unsigned getUniqueID() const { return UniqueID; }
77 
getSectionOffset()78   uint64_t getSectionOffset() const { return SectionOffset; }
setSectionOffset(uint64_t Offset)79   void setSectionOffset(uint64_t Offset) { SectionOffset = Offset; }
80 
getSegmentIndex()81   uint32_t getSegmentIndex() const { return SegmentIndex; }
setSegmentIndex(uint32_t Index)82   void setSegmentIndex(uint32_t Index) { SegmentIndex = Index; }
83 
getPassive()84   bool getPassive() const {
85     assert(isWasmData());
86     return IsPassive;
87   }
88   void setPassive(bool V = true) {
89     assert(isWasmData());
90     IsPassive = V;
91   }
classof(const MCSection * S)92   static bool classof(const MCSection *S) { return S->getVariant() == SV_Wasm; }
93 };
94 
95 } // end namespace llvm
96 
97 #endif
98