blob: 3a94d0ffc16262eaf87453e191b18554af719a0c [file] [log] [blame]
//===- GenericSpecializationMangler.h - generic specializations -*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SIL_UTILS_GENERICSPECIALIZATIONMANGLER_H
#define SWIFT_SIL_UTILS_GENERICSPECIALIZATIONMANGLER_H
#include "swift/AST/ASTMangler.h"
#include "swift/Basic/NullablePtr.h"
#include "swift/Demangling/Demangler.h"
#include "swift/SIL/SILFunction.h"
namespace swift {
namespace Mangle {
enum class SpecializationKind : uint8_t {
Generic,
NotReAbstractedGeneric,
FunctionSignature,
};
/// Inject SpecializationPass into the Mangle namespace.
using SpecializationPass = Demangle::SpecializationPass;
/// The base class for specialization mangles.
class SpecializationMangler : public Mangle::ASTMangler {
protected:
/// The specialization pass.
SpecializationPass Pass;
IsSerialized_t Serialized;
/// The original function which is specialized.
SILFunction *Function;
std::string FunctionName;
llvm::SmallVector<char, 32> ArgOpStorage;
llvm::raw_svector_ostream ArgOpBuffer;
protected:
SpecializationMangler(SpecializationPass P, IsSerialized_t Serialized,
SILFunction *F)
: Pass(P), Serialized(Serialized), Function(F),
ArgOpBuffer(ArgOpStorage) {}
SpecializationMangler(SpecializationPass P, IsSerialized_t Serialized,
std::string functionName)
: Pass(P), Serialized(Serialized), Function(nullptr),
FunctionName(functionName), ArgOpBuffer(ArgOpStorage) {}
void beginMangling();
/// Finish the mangling of the symbol and return the mangled name.
std::string finalize();
void appendSpecializationOperator(StringRef Op) {
appendOperator(Op, StringRef(ArgOpStorage.data(), ArgOpStorage.size()));
}
};
// The mangler for specialized generic functions.
class GenericSpecializationMangler : public SpecializationMangler {
GenericSpecializationMangler(std::string origFuncName)
: SpecializationMangler(SpecializationPass::GenericSpecializer,
IsNotSerialized, origFuncName) {}
GenericSignature getGenericSignature() {
assert(Function && "Need a SIL function to get a generic signature");
return Function->getLoweredFunctionType()->getInvocationGenericSignature();
}
void appendSubstitutions(GenericSignature sig, SubstitutionMap subs);
std::string manglePrespecialized(GenericSignature sig,
SubstitutionMap subs);
public:
GenericSpecializationMangler(SILFunction *F, IsSerialized_t Serialized)
: SpecializationMangler(SpecializationPass::GenericSpecializer,
Serialized, F) {}
std::string mangleNotReabstracted(SubstitutionMap subs);
std::string mangleReabstracted(SubstitutionMap subs, bool alternativeMangling);
std::string mangleForDebugInfo(GenericSignature sig, SubstitutionMap subs,
bool forInlining);
std::string manglePrespecialized(SubstitutionMap subs) {
return manglePrespecialized(getGenericSignature(), subs);
}
static std::string manglePrespecialization(std::string unspecializedName,
GenericSignature genericSig,
GenericSignature specializedSig);
};
} // end namespace Mangle
} // end namespace swift
#endif