[llvm] r221742 - Extend intrinsic name mangling to support arrays, named structs, and function types.
Sean Silva
chisophugis at gmail.com
Tue Nov 11 16:33:37 PST 2014
Can you please beef up the comment to give a declarative/human-readable
description of the mangling scheme?
Also, would it make sense to document this mangling in LangRef?
One nit:
+ Result += "f"; //ensure distinguishable
"... use proper capitalization, punctuation, etc ...."
http://llvm.org/docs/CodingStandards.html#commenting
-- Sean Silva
On Tue, Nov 11, 2014 at 4:21 PM, Philip Reames <listmail at philipreames.com>
wrote:
> Author: reames
> Date: Tue Nov 11 18:21:51 2014
> New Revision: 221742
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221742&view=rev
> Log:
> Extend intrinsic name mangling to support arrays, named structs, and
> function types.
>
> Currently, we have a type parameter mechanism for intrinsics. Rather than
> having to specify a separate intrinsic for each combination of argument and
> return types, we can specify a single intrinsic with one or more type
> parameters. These type parameters are passed explicitly to
> Intrinsic::getDeclaration or can be specified implicitly in the naming of
> the intrinsic function in an LL file.
>
> Today, the types are limited to integer, floating point, and pointer
> types. With a goal of supporting symbolic targets for patchpoints and
> statepoints, this change adds support for function types. The change also
> includes support for first class aggregate types (named structures and
> arrays) since these appear in function types we've encountered.
>
> Reviewed by: atrick, ributzka
> Differential Revision: http://reviews.llvm.org/D4608
>
>
> Modified:
> llvm/trunk/lib/IR/Function.cpp
>
> Modified: llvm/trunk/lib/IR/Function.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Function.cpp?rev=221742&r1=221741&r2=221742&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Function.cpp (original)
> +++ llvm/trunk/lib/IR/Function.cpp Tue Nov 11 18:21:51 2014
> @@ -455,6 +455,33 @@ unsigned Function::lookupIntrinsicID() c
> return 0;
> }
>
> +/// Returns a stable mangling for the type specified for use in the name
> +/// mangling scheme used by 'any' types in intrinsic signatures.
> +static std::string getMangledTypeStr(Type* Ty) {
> + std::string Result;
> + if (PointerType* PTyp = dyn_cast<PointerType>(Ty)) {
> + Result += "p" + llvm::utostr(PTyp->getAddressSpace()) +
> + getMangledTypeStr(PTyp->getElementType());
> + } else if (ArrayType* ATyp = dyn_cast<ArrayType>(Ty)) {
> + Result += "a" + llvm::utostr(ATyp->getNumElements()) +
> + getMangledTypeStr(ATyp->getElementType());
> + } else if (StructType* STyp = dyn_cast<StructType>(Ty)) {
> + if (!STyp->isLiteral())
> + Result += STyp->getName();
> + else
> + llvm_unreachable("TODO: implement literal types");
> + } else if (FunctionType* FT = dyn_cast<FunctionType>(Ty)) {
> + Result += "f_" + getMangledTypeStr(FT->getReturnType());
> + for (size_t i = 0; i < FT->getNumParams(); i++)
> + Result += getMangledTypeStr(FT->getParamType(i));
> + if (FT->isVarArg())
> + Result += "vararg";
> + Result += "f"; //ensure distinguishable
> + } else if (Ty)
> + Result += EVT::getEVT(Ty).getEVTString();
> + return Result;
> +}
> +
> std::string Intrinsic::getName(ID id, ArrayRef<Type*> Tys) {
> assert(id < num_intrinsics && "Invalid intrinsic ID!");
> static const char * const Table[] = {
> @@ -467,12 +494,7 @@ std::string Intrinsic::getName(ID id, Ar
> return Table[id];
> std::string Result(Table[id]);
> for (unsigned i = 0; i < Tys.size(); ++i) {
> - if (PointerType* PTyp = dyn_cast<PointerType>(Tys[i])) {
> - Result += ".p" + llvm::utostr(PTyp->getAddressSpace()) +
> - EVT::getEVT(PTyp->getElementType()).getEVTString();
> - }
> - else if (Tys[i])
> - Result += "." + EVT::getEVT(Tys[i]).getEVTString();
> + Result += "." + getMangledTypeStr(Tys[i]);
> }
> return Result;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141111/0f61d369/attachment.html>
More information about the llvm-commits
mailing list