[llvm] r221742 - Extend intrinsic name mangling to support arrays, named structs, and function types.
Sean Silva
chisophugis at gmail.com
Tue Nov 11 16:44:42 PST 2014
On Tue, Nov 11, 2014 at 4:42 PM, Philip Reames <listmail at philipreames.com>
wrote:
>
> On 11/11/2014 04:33 PM, Sean Silva wrote:
>
> Can you please beef up the comment to give a declarative/human-readable
> description of the mangling scheme?
>
> Sure. Will address in a follow up commit. (Without further review unless
> you object.)
>
Go for it.
>
>
> Also, would it make sense to document this mangling in LangRef?
>
> It is currently not documented. I don't have a strong opinion, but would
> lean towards not documenting it. It's arguably an internal implementation
> detail. There's enough rough edges around this mechanism that I'm really
> reluctant to encourage it's use, except through the programmatic APIs.
> (For example, if you get the naming wrong, it's a silent codegen problem.
> This is not new.)
>
Makes sense.
-- Sean Silva
>
> For context, there's discussion of removing this mechanism entirely since
> it makes the code much harder to read. That change (which might include
> special casing type rules around intrinsics) will definitely need broader
> review and documentation.
>
>
>
> One nit:
>
> + Result += "f"; //ensure distinguishable
>
> "... use proper capitalization, punctuation, etc ...."
> http://llvm.org/docs/CodingStandards.html#commenting
>
> Will fix in follow up.
>
>
> -- 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/3df02d01/attachment.html>
More information about the llvm-commits
mailing list