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/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(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 47 void MCSectionWasm::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T, 48 raw_ostream &OS, 49 const MCExpr *Subsection) const { 50 51 if (shouldOmitSectionDirective(SectionName, MAI)) { 52 OS << '\t' << getSectionName(); 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, getSectionName()); 63 OS << ",\""; 64 65 if (IsPassive) 66 OS << "passive"; 67 68 OS << '"'; 69 70 OS << ','; 71 72 // If comment string is '@', e.g. as on ARM - use '%' instead 73 if (MAI.getCommentString()[0] == '@') 74 OS << '%'; 75 else 76 OS << '@'; 77 78 // TODO: Print section type. 79 80 if (isUnique()) 81 OS << ",unique," << UniqueID; 82 83 OS << '\n'; 84 85 if (Subsection) { 86 OS << "\t.subsection\t"; 87 Subsection->print(OS, &MAI); 88 OS << '\n'; 89 } 90 } 91 92 bool MCSectionWasm::UseCodeAlign() const { return false; } 93 94 bool MCSectionWasm::isVirtualSection() const { return false; } 95