xref: /freebsd/contrib/llvm-project/llvm/lib/MC/MCSectionWasm.cpp (revision 681ce946f33e75c590e97c53076e86dff1fe8f4a)
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  
9  #include "llvm/MC/MCSectionWasm.h"
10  #include "llvm/MC/MCAsmInfo.h"
11  #include "llvm/MC/MCExpr.h"
12  #include "llvm/MC/MCSymbol.h"
13  #include "llvm/MC/MCSymbolWasm.h"
14  #include "llvm/Support/raw_ostream.h"
15  
16  using namespace llvm;
17  
18  // Decides whether a '.section' directive
19  // should be printed before the section name.
20  bool MCSectionWasm::shouldOmitSectionDirective(StringRef Name,
21                                                 const MCAsmInfo &MAI) const {
22    return MAI.shouldOmitSectionDirective(Name);
23  }
24  
25  static void printName(raw_ostream &OS, StringRef Name) {
26    if (Name.find_first_not_of("0123456789_."
27                               "abcdefghijklmnopqrstuvwxyz"
28                               "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == Name.npos) {
29      OS << Name;
30      return;
31    }
32    OS << '"';
33    for (const char *B = Name.begin(), *E = Name.end(); B < E; ++B) {
34      if (*B == '"') // Unquoted "
35        OS << "\\\"";
36      else if (*B != '\\') // Neither " or backslash
37        OS << *B;
38      else if (B + 1 == E) // Trailing backslash
39        OS << "\\\\";
40      else {
41        OS << B[0] << B[1]; // Quoted character
42        ++B;
43      }
44    }
45    OS << '"';
46  }
47  
48  void MCSectionWasm::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
49                                           raw_ostream &OS,
50                                           const MCExpr *Subsection) const {
51  
52    if (shouldOmitSectionDirective(getName(), MAI)) {
53      OS << '\t' << getName();
54      if (Subsection) {
55        OS << '\t';
56        Subsection->print(OS, &MAI);
57      }
58      OS << '\n';
59      return;
60    }
61  
62    OS << "\t.section\t";
63    printName(OS, getName());
64    OS << ",\"";
65  
66    if (IsPassive)
67      OS << 'p';
68    if (Group)
69      OS << 'G';
70    if (SegmentFlags & wasm::WASM_SEG_FLAG_STRINGS)
71      OS << 'S';
72    if (SegmentFlags & wasm::WASM_SEG_FLAG_TLS)
73      OS << 'T';
74  
75    OS << '"';
76  
77    OS << ',';
78  
79    // If comment string is '@', e.g. as on ARM - use '%' instead
80    if (MAI.getCommentString()[0] == '@')
81      OS << '%';
82    else
83      OS << '@';
84  
85    // TODO: Print section type.
86  
87    if (Group) {
88      OS << ",";
89      printName(OS, Group->getName());
90      OS << ",comdat";
91    }
92  
93    if (isUnique())
94      OS << ",unique," << UniqueID;
95  
96    OS << '\n';
97  
98    if (Subsection) {
99      OS << "\t.subsection\t";
100      Subsection->print(OS, &MAI);
101      OS << '\n';
102    }
103  }
104  
105  bool MCSectionWasm::UseCodeAlign() const { return false; }
106  
107  bool MCSectionWasm::isVirtualSection() const { return false; }
108