<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<br>
<div class="moz-cite-prefix">On 11/11/2014 04:33 PM, Sean Silva
wrote:<br>
</div>
<blockquote
cite="mid:CAHnXoa=qgU9m6c0wkP13o+3S=SUWL4vdXs0YE9xa8PMvLVe0hQ@mail.gmail.com"
type="cite">
<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? <br>
</font></div>
</div>
</blockquote>
<font face="arial, sans-serif">Sure. Will address in a follow up
commit. (Without further review unless you object.)</font><br>
<blockquote
cite="mid:CAHnXoa=qgU9m6c0wkP13o+3S=SUWL4vdXs0YE9xa8PMvLVe0hQ@mail.gmail.com"
type="cite">
<div dir="ltr">
<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>
</div>
</blockquote>
<font face="arial, sans-serif">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.)<br>
<br>
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. </font><br>
<blockquote
cite="mid:CAHnXoa=qgU9m6c0wkP13o+3S=SUWL4vdXs0YE9xa8PMvLVe0hQ@mail.gmail.com"
type="cite">
<div dir="ltr"><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
moz-do-not-send="true"
href="http://llvm.org/docs/CodingStandards.html#commenting">http://llvm.org/docs/CodingStandards.html#commenting</a><br>
</div>
</div>
</div>
</blockquote>
Will fix in follow up.<br>
<blockquote
cite="mid:CAHnXoa=qgU9m6c0wkP13o+3S=SUWL4vdXs0YE9xa8PMvLVe0hQ@mail.gmail.com"
type="cite">
<div dir="ltr">
<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 moz-do-not-send="true"
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 moz-do-not-send="true"
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 moz-do-not-send="true"
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 moz-do-not-send="true"
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 moz-do-not-send="true"
href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a moz-do-not-send="true"
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>
</blockquote>
<br>
</body>
</html>