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/MCSymbolWasm.h" |
13 | #include "llvm/Support/raw_ostream.h" |
14 | |
15 | using namespace llvm; |
16 | |
17 | // Decides whether a '.section' directive |
18 | // should be printed before the section name. |
19 | bool MCSectionWasm::shouldOmitSectionDirective(StringRef Name, |
20 | const MCAsmInfo &MAI) const { |
21 | return MAI.shouldOmitSectionDirective(SectionName: Name); |
22 | } |
23 | |
24 | static void printName(raw_ostream &OS, StringRef Name) { |
25 | if (Name.find_first_not_of(Chars: "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 | |
47 | void MCSectionWasm::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, |
48 | raw_ostream &OS, |
49 | uint32_t Subsection) const { |
50 | |
51 | if (shouldOmitSectionDirective(Name: getName(), MAI)) { |
52 | OS << '\t' << getName(); |
53 | if (Subsection) |
54 | OS << '\t' << Subsection; |
55 | OS << '\n'; |
56 | return; |
57 | } |
58 | |
59 | OS << "\t.section\t" ; |
60 | printName(OS, Name: getName()); |
61 | OS << ",\"" ; |
62 | |
63 | if (IsPassive) |
64 | OS << 'p'; |
65 | if (Group) |
66 | OS << 'G'; |
67 | if (SegmentFlags & wasm::WASM_SEG_FLAG_STRINGS) |
68 | OS << 'S'; |
69 | if (SegmentFlags & wasm::WASM_SEG_FLAG_TLS) |
70 | OS << 'T'; |
71 | if (SegmentFlags & wasm::WASM_SEG_FLAG_RETAIN) |
72 | OS << 'R'; |
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, Name: 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" << Subsection << '\n'; |
99 | } |
100 | |
101 | bool MCSectionWasm::useCodeAlign() const { return false; } |
102 | |