[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