<div dir="ltr"><div><font face="arial, sans-serif">Can you please beef up the comment to give a declarative/human-readable description of the mangling scheme? </font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Also, would it make sense to document this mangling in LangRef?</font></div><span style="font-family:arial,sans-serif;font-size:13px"><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div>One nit:<br></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div>+    Result += "f"; //ensure distinguishable</span><div><br><div><font face="arial, sans-serif">"... use proper capitalization, punctuation, etc ...." </font><a href="http://llvm.org/docs/CodingStandards.html#commenting">http://llvm.org/docs/CodingStandards.html#commenting</a><br></div><div><br></div><div>-- Sean Silva</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 11, 2014 at 4:21 PM, Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: reames<br>
Date: Tue Nov 11 18:21:51 2014<br>
New Revision: 221742<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=221742&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=221742&view=rev</a><br>
Log:<br>
Extend intrinsic name mangling to support arrays, named structs, and function types.<br>
<br>
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.<br>
<br>
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.<br>
<br>
Reviewed by: atrick, ributzka<br>
Differential Revision: <a href="http://reviews.llvm.org/D4608" target="_blank">http://reviews.llvm.org/D4608</a><br>
<br>
<br>
Modified:<br>
    llvm/trunk/lib/IR/Function.cpp<br>
<br>
Modified: llvm/trunk/lib/IR/Function.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Function.cpp?rev=221742&r1=221741&r2=221742&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Function.cpp?rev=221742&r1=221741&r2=221742&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Function.cpp (original)<br>
+++ llvm/trunk/lib/IR/Function.cpp Tue Nov 11 18:21:51 2014<br>
@@ -455,6 +455,33 @@ unsigned Function::lookupIntrinsicID() c<br>
   return 0;<br>
 }<br>
<br>
+/// Returns a stable mangling for the type specified for use in the name<br>
+/// mangling scheme used by 'any' types in intrinsic signatures.<br>
+static std::string getMangledTypeStr(Type* Ty) {<br>
+  std::string Result;<br>
+  if (PointerType* PTyp = dyn_cast<PointerType>(Ty)) {<br>
+    Result += "p" + llvm::utostr(PTyp->getAddressSpace()) +<br>
+      getMangledTypeStr(PTyp->getElementType());<br>
+  } else if (ArrayType* ATyp = dyn_cast<ArrayType>(Ty)) {<br>
+    Result += "a" + llvm::utostr(ATyp->getNumElements()) +<br>
+      getMangledTypeStr(ATyp->getElementType());<br>
+  } else if (StructType* STyp = dyn_cast<StructType>(Ty)) {<br>
+    if (!STyp->isLiteral())<br>
+      Result += STyp->getName();<br>
+    else<br>
+      llvm_unreachable("TODO: implement literal types");<br>
+  } else if (FunctionType* FT = dyn_cast<FunctionType>(Ty)) {<br>
+    Result += "f_" + getMangledTypeStr(FT->getReturnType());<br>
+    for (size_t i = 0; i < FT->getNumParams(); i++)<br>
+      Result += getMangledTypeStr(FT->getParamType(i));<br>
+    if (FT->isVarArg())<br>
+      Result += "vararg";<br>
+    Result += "f"; //ensure distinguishable<br>
+  } else if (Ty)<br>
+    Result += EVT::getEVT(Ty).getEVTString();<br>
+  return Result;<br>
+}<br>
+<br>
 std::string Intrinsic::getName(ID id, ArrayRef<Type*> Tys) {<br>
   assert(id < num_intrinsics && "Invalid intrinsic ID!");<br>
   static const char * const Table[] = {<br>
@@ -467,12 +494,7 @@ std::string Intrinsic::getName(ID id, Ar<br>
     return Table[id];<br>
   std::string Result(Table[id]);<br>
   for (unsigned i = 0; i < Tys.size(); ++i) {<br>
-    if (PointerType* PTyp = dyn_cast<PointerType>(Tys[i])) {<br>
-      Result += ".p" + llvm::utostr(PTyp->getAddressSpace()) +<br>
-                EVT::getEVT(PTyp->getElementType()).getEVTString();<br>
-    }<br>
-    else if (Tys[i])<br>
-      Result += "." + EVT::getEVT(Tys[i]).getEVTString();<br>
+    Result += "." + getMangledTypeStr(Tys[i]);<br>
   }<br>
   return Result;<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>