blob: ab4cd7b007ec9fe99907a05399716af59486c4fd [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- MCSectionWasm.h - Wasm 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 MCSectionWasm class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_MC_MCSECTIONWASM_H
15#define LLVM_MC_MCSECTIONWASM_H
16
17#include "llvm/ADT/Twine.h"
18#include "llvm/MC/MCSection.h"
19#include "llvm/MC/MCSymbolWasm.h"
20#include "llvm/Support/Debug.h"
21#include "llvm/Support/raw_ostream.h"
22
23namespace llvm {
24
25class MCSymbol;
26
27/// This represents a section on wasm.
28class MCSectionWasm final : public MCSection {
29 /// This is the name of the section. The referenced memory is owned by
30 /// TargetLoweringObjectFileWasm's WasmUniqueMap.
31 StringRef SectionName;
32
33 unsigned UniqueID;
34
35 const MCSymbolWasm *Group;
36
37 // The offset of the MC function/data section in the wasm code/data section.
38 // For data relocations the offset is relative to start of the data payload
39 // itself and does not include the size of the section header.
40 uint64_t SectionOffset = 0;
41
42 // For data sections, this is the index of of the corresponding wasm data
43 // segment
44 uint32_t SegmentIndex = 0;
45
46 friend class MCContext;
47 MCSectionWasm(StringRef Section, SectionKind K, const MCSymbolWasm *group,
48 unsigned UniqueID, MCSymbol *Begin)
49 : MCSection(SV_Wasm, K, Begin), SectionName(Section), UniqueID(UniqueID),
50 Group(group) {}
51
52 void setSectionName(StringRef Name) { SectionName = Name; }
53
54public:
55 ~MCSectionWasm();
56
57 /// Decides whether a '.section' directive should be printed before the
58 /// section name
59 bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
60
61 StringRef getSectionName() const { return SectionName; }
62 const MCSymbolWasm *getGroup() const { return Group; }
63
64 void PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
65 raw_ostream &OS,
66 const MCExpr *Subsection) const override;
67 bool UseCodeAlign() const override;
68 bool isVirtualSection() const override;
69
70 bool isWasmData() const {
71 return Kind.isGlobalWriteableData() || Kind.isReadOnly();
72 }
73
74 bool isUnique() const { return UniqueID != ~0U; }
75 unsigned getUniqueID() const { return UniqueID; }
76
77 uint64_t getSectionOffset() const { return SectionOffset; }
78 void setSectionOffset(uint64_t Offset) { SectionOffset = Offset; }
79
80 uint32_t getSegmentIndex() const { return SegmentIndex; }
81 void setSegmentIndex(uint32_t Index) { SegmentIndex = Index; }
82
83 static bool classof(const MCSection *S) { return S->getVariant() == SV_Wasm; }
84};
85
86} // end namespace llvm
87
88#endif