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
16using namespace llvm;
17
18// Decides whether a '.section' directive
19// should be printed before the section name.
20bool MCSectionWasm::shouldOmitSectionDirective(StringRef Name,
21                                               const MCAsmInfo &MAI) const {
22  return MAI.shouldOmitSectionDirective(Name);
23}
24
25static 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
48void 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
105bool MCSectionWasm::UseCodeAlign() const { return false; }
106
107bool MCSectionWasm::isVirtualSection() const { return false; }
108