LLVM  15.0.0git
MCSectionWasm.cpp
Go to the documentation of this file.
1 //===- lib/MC/MCSectionWasm.cpp - Wasm Code Section Representation --------===//
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 
10 #include "llvm/MC/MCAsmInfo.h"
11 #include "llvm/MC/MCExpr.h"
12 #include "llvm/MC/MCSymbolWasm.h"
14 
15 using namespace llvm;
16 
17 // Decides whether a '.section' directive
18 // should be printed before the section name.
20  const MCAsmInfo &MAI) const {
21  return MAI.shouldOmitSectionDirective(Name);
22 }
23 
24 static void printName(raw_ostream &OS, StringRef Name) {
25  if (Name.find_first_not_of("0123456789_."
26  "abcdefghijklmnopqrstuvwxyz"
27  "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == Name.npos) {
28  OS << Name;
29  return;
30  }
31  OS << '"';
32  for (const char *B = Name.begin(), *E = Name.end(); B < E; ++B) {
33  if (*B == '"') // Unquoted "
34  OS << "\\\"";
35  else if (*B != '\\') // Neither " or backslash
36  OS << *B;
37  else if (B + 1 == E) // Trailing backslash
38  OS << "\\\\";
39  else {
40  OS << B[0] << B[1]; // Quoted character
41  ++B;
42  }
43  }
44  OS << '"';
45 }
46 
48  raw_ostream &OS,
49  const MCExpr *Subsection) const {
50 
51  if (shouldOmitSectionDirective(getName(), MAI)) {
52  OS << '\t' << getName();
53  if (Subsection) {
54  OS << '\t';
55  Subsection->print(OS, &MAI);
56  }
57  OS << '\n';
58  return;
59  }
60 
61  OS << "\t.section\t";
62  printName(OS, getName());
63  OS << ",\"";
64 
65  if (IsPassive)
66  OS << 'p';
67  if (Group)
68  OS << 'G';
69  if (SegmentFlags & wasm::WASM_SEG_FLAG_STRINGS)
70  OS << 'S';
71  if (SegmentFlags & wasm::WASM_SEG_FLAG_TLS)
72  OS << 'T';
73 
74  OS << '"';
75 
76  OS << ',';
77 
78  // If comment string is '@', e.g. as on ARM - use '%' instead
79  if (MAI.getCommentString()[0] == '@')
80  OS << '%';
81  else
82  OS << '@';
83 
84  // TODO: Print section type.
85 
86  if (Group) {
87  OS << ",";
88  printName(OS, Group->getName());
89  OS << ",comdat";
90  }
91 
92  if (isUnique())
93  OS << ",unique," << UniqueID;
94 
95  OS << '\n';
96 
97  if (Subsection) {
98  OS << "\t.subsection\t";
99  Subsection->print(OS, &MAI);
100  OS << '\n';
101  }
102 }
103 
104 bool MCSectionWasm::useCodeAlign() const { return false; }
105 
106 bool MCSectionWasm::isVirtualSection() const { return false; }
llvm::MCSection::Name
StringRef Name
Definition: MCSection.h:112
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:17
llvm::MCAsmInfo::getCommentString
StringRef getCommentString() const
Definition: MCAsmInfo.h:653
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::Triple
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
llvm::MCSectionWasm::printSwitchToSection
void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, raw_ostream &OS, const MCExpr *Subsection) const override
Definition: MCSectionWasm.cpp:47
llvm::MCAsmInfo::shouldOmitSectionDirective
virtual bool shouldOmitSectionDirective(StringRef SectionName) const
Return true if the .section directive should be omitted when emitting SectionName.
Definition: MCAsmInfo.cpp:137
E
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
MCSymbolWasm.h
B
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:54
llvm::MCSectionWasm::isVirtualSection
bool isVirtualSection() const override
Check whether this section is "virtual", that is has no actual object file contents.
Definition: MCSectionWasm.cpp:106
llvm::MCSymbol::getName
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:198
llvm::MCSectionWasm::shouldOmitSectionDirective
bool shouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const
Decides whether a '.section' directive should be printed before the section name.
Definition: MCSectionWasm.cpp:19
llvm::wasm::WASM_SEG_FLAG_TLS
@ WASM_SEG_FLAG_TLS
Definition: Wasm.h:391
printName
static void printName(raw_ostream &OS, StringRef Name)
Definition: MCSectionWasm.cpp:24
MCAsmInfo.h
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm::MCSection::getName
StringRef getName() const
Definition: MCSection.h:123
llvm::GraphProgram::Name
Name
Definition: GraphWriter.h:50
llvm::MCExpr::print
void print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens=false) const
Definition: MCExpr.cpp:41
llvm::MCSectionWasm::isUnique
bool isUnique() const
Definition: MCSectionWasm.h:72
raw_ostream.h
MCExpr.h
llvm::wasm::WASM_SEG_FLAG_STRINGS
@ WASM_SEG_FLAG_STRINGS
Definition: Wasm.h:390
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
llvm::MCSectionWasm::useCodeAlign
bool useCodeAlign() const override
Return true if a .align directive should use "optimized nops" to fill instead of 0s.
Definition: MCSectionWasm.cpp:104
MCSectionWasm.h