void FunctionSignatureSpecializationMangler::mangleConstantProp(LiteralInst *LI) { // Append the prefix for constant propagation 'p'. ArgOpBuffer << 'p'; // Then append the unique identifier of our literal. switch (LI->getKind()) { default: llvm_unreachable("unknown literal"); case SILInstructionKind::DynamicFunctionRefInst: { SILFunction *F = cast<DynamicFunctionRefInst>(LI)->getReferencedFunction(); ArgOpBuffer << 'f'; appendIdentifier(F->getName()); break; } case SILInstructionKind::FunctionRefInst: { SILFunction *F = cast<FunctionRefInst>(LI)->getReferencedFunction(); ArgOpBuffer << 'f'; appendIdentifier(F->getName()); break; } case SILInstructionKind::GlobalAddrInst: { SILGlobalVariable *G = cast<GlobalAddrInst>(LI)->getReferencedGlobal(); ArgOpBuffer << 'g'; appendIdentifier(G->getName()); break; } case SILInstructionKind::IntegerLiteralInst: { APInt apint = cast<IntegerLiteralInst>(LI)->getValue(); ArgOpBuffer << 'i' << apint; break; } case SILInstructionKind::FloatLiteralInst: { APInt apint = cast<FloatLiteralInst>(LI)->getBits(); ArgOpBuffer << 'd' << apint; break; } case SILInstructionKind::StringLiteralInst: { StringLiteralInst *SLI = cast<StringLiteralInst>(LI); StringRef V = SLI->getValue(); assert(V.size() <= 32 && "Cannot encode string of length > 32"); std::string VBuffer; if (!V.empty() && (isDigit(V[0]) || V[0] == '_')) { VBuffer = "_"; VBuffer.append(V.data(), V.size()); V = VBuffer; } appendIdentifier(V); ArgOpBuffer << 's'; switch (SLI->getEncoding()) { case StringLiteralInst::Encoding::Bytes: ArgOpBuffer << 'B'; break; case StringLiteralInst::Encoding::UTF8: ArgOpBuffer << 'b'; break; case StringLiteralInst::Encoding::UTF16: ArgOpBuffer << 'w'; break; case StringLiteralInst::Encoding::ObjCSelector: ArgOpBuffer << 'c'; break; } break; } } }
void FunctionSignatureSpecializationMangler::mangleConstantProp(LiteralInst *LI) { Mangler &M = getMangler(); // Append the prefix for constant propagation 'cp'. M.append("cp"); // Then append the unique identifier of our literal. switch (LI->getKind()) { default: llvm_unreachable("unknown literal"); case ValueKind::FunctionRefInst: { SILFunction *F = cast<FunctionRefInst>(LI)->getReferencedFunction(); M.append("fr"); M.mangleIdentifierSymbol(F->getName()); break; } case ValueKind::GlobalAddrInst: { SILGlobalVariable *G = cast<GlobalAddrInst>(LI)->getReferencedGlobal(); M.append("g"); M.mangleIdentifierSymbol(G->getName()); break; } case ValueKind::IntegerLiteralInst: { APInt apint = cast<IntegerLiteralInst>(LI)->getValue(); M.append("i"); M.mangleNatural(apint); break; } case ValueKind::FloatLiteralInst: { APInt apint = cast<FloatLiteralInst>(LI)->getBits(); M.append("fl"); M.mangleNatural(apint); break; } case ValueKind::StringLiteralInst: { StringLiteralInst *SLI = cast<StringLiteralInst>(LI); StringRef V = SLI->getValue(); assert(V.size() <= 32 && "Cannot encode string of length > 32"); llvm::SmallString<33> Str; Str += "u"; Str += V; M.append("se"); M.mangleNatural(APInt(32, unsigned(SLI->getEncoding()))); M.append("v"); M.mangleIdentifier(Str); break; } } }