From 37549464c13e5f059925b9d8be1ea8e87711537e Mon Sep 17 00:00:00 2001 From: shafik Date: Wed, 4 Mar 2020 14:52:31 -0800 Subject: [PATCH] [dsymutil] Fix template stripping in getDIENames(...) to account for overloaded operators Currently dsymutil when generating accelerator tables will attempt to strip the template parameters from names for subroutines. For some overload operators which contain < in their names e.g. operator< the current method ends up stripping the operator name as well, we just end up with the name operator in the table for each case. Differential Revision: https://reviews.llvm.org/D75545 --- llvm/lib/DWARFLinker/DWARFLinker.cpp | 38 +++++++++-- .../templated_operators/template_operators | Bin 0 -> 9648 bytes .../templated_operators/template_operators.o | Bin 0 -> 4692 bytes .../dsymutil/X86/template_operators.test | 62 ++++++++++++++++++ 4 files changed, 96 insertions(+), 4 deletions(-) create mode 100755 llvm/test/tools/dsymutil/Inputs/private/tmp/templated_operators/template_operators create mode 100644 llvm/test/tools/dsymutil/Inputs/private/tmp/templated_operators/template_operators.o create mode 100644 llvm/test/tools/dsymutil/X86/template_operators.test diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp index 2a957a2f82f1..66da6265ca53 100644 --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -119,6 +119,37 @@ AddressesMap::~AddressesMap() {} DwarfEmitter::~DwarfEmitter() {} +static Optional StripTemplateParameters(StringRef Name) { + // We are looking for template parameters to strip from Name. e.g. + // + // operator< + // + // We look for > at the end but if it does not contain any < then we + // have something like operator>>. We check for the operator<=> case. + if (!Name.endswith(">") || Name.count("<") == 0 || Name.endswith("<=>")) + return {}; + + // How many < until we have the start of the template parameters. + size_t NumLeftAnglesToSkip = 1; + + // If we have operator<=> then we need to skip its < as well. + NumLeftAnglesToSkip += Name.count("<=>"); + + size_t RightAngleCount = Name.count('>'); + size_t LeftAngleCount = Name.count('<'); + + // If we have more < than > we have operator< or operator<< + // we to account for their < as well. + if (LeftAngleCount > RightAngleCount) + NumLeftAnglesToSkip += LeftAngleCount - RightAngleCount; + + size_t StartOfTemplate = 0; + while (NumLeftAnglesToSkip--) + StartOfTemplate = Name.find('<', StartOfTemplate) + 1; + + return Name.substr(0, StartOfTemplate - 1); +} + bool DWARFLinker::DIECloner::getDIENames(const DWARFDie &Die, AttributesInfo &Info, OffsetsStringPool &StringPool, @@ -140,10 +171,9 @@ bool DWARFLinker::DIECloner::getDIENames(const DWARFDie &Die, Info.Name = StringPool.getEntry(Name); if (StripTemplate && Info.Name && Info.MangledName != Info.Name) { - // FIXME: dsymutil compatibility. This is wrong for operator< - auto Split = Info.Name.getString().split('<'); - if (!Split.second.empty()) - Info.NameWithoutTemplate = StringPool.getEntry(Split.first); + StringRef Name = Info.Name.getString(); + if (Optional StrippedName = StripTemplateParameters(Name)) + Info.NameWithoutTemplate = StringPool.getEntry(*StrippedName); } return Info.Name || Info.MangledName; diff --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/templated_operators/template_operators b/llvm/test/tools/dsymutil/Inputs/private/tmp/templated_operators/template_operators new file mode 100755 index 0000000000000000000000000000000000000000..caaf1c1394120b5805866b511024fc42a803bd18 GIT binary patch literal 9648 zcmeHNU1(fI6rP)(8fxusL7}2;Z(<^`$Znz{L44ShEN*P6HAzK-?Ihc5+J*gde`+EK zi?xu5fdzl65~RMAf_(^zJ_i)UzWC;A_CX;+3x$G6D2?AYJG0rndsp&Ua1NZA{mz_o z=FE40xO?aRwsrgdLqa&6LXK6xRL$|dr!dGoF6d}g`C7D%CXU@(YjfXZ$+6Y%+uri5Jnj#WhNyHi|Kea zC3D4m+k8D{3glzF5%Og?qfN^5*@nZ~lCMYCXYvty^Wi+MiLW; zW#*#G&UJ8N{N(ZI*tj`|T@P=-lr^5T5OS(`RY-_FTxV)dx0b&L{XvYm=*#GhTy=3B z0`ORJJl8A4Gw4TfA}%1|!}xs)N^!Na-a#ma+Y93N`;5}&Lia(#r9wWOO2)%;i>Wza z$`er5v32jo^!@8EUHk6J?{9t59TUFs{2v)O9b5i0cInp8FVTBker)Cae_|`8JDVTlfo=HLrJL8CrPCXM%Y0h>>(fRD z>Epn^N%ah4J`NL&4q+dM;YNqQ0lYQv*$q={qR8szU4W(N#z)bOekbtbdhF8ALuY=P z4+V~VhynapJrWUWeal$Xa_P>Rqud%@Di7p%WqW{JZx4K~+Amc5m1!fQ7Qb*=kR@ajt{FZJ zGLHRbY+k>f@2QB0l+%fK#)pqZ;}gfHHXpydk6!_{v7Kou zHI5vK{r?Urg6Y|0Mm#Gz(idc6A#tu$OkkINmW2*Zi($S4=@eCLQ+B7sd!Ew1aXj;V z>v-0*=6GiR0ehFtb+01x- z?>+b?@O-BuuG~6%mg9T}6GCIYYoMXO0du?`T7^=GPjZ|9Ldw;Gu~j1Gv0+# zh#Bt^K#0}+`u)#A7}We4b9^`P{IG<+M|HfxyNx&RonF@Q2JbdLqUYz@Siix$jh`{^ zy>z_6CjK$3jY7;h8u1*BT6mrYoN|5sM>RI@+qj?2aiQnqo;a~NUaxBG>hZTVHuYo_ z=3CTSEgvYnbN(#V?DdLV;9h7S^eHHhO7SA1lmgegU z7SGiQi|1;Tvh}K$>W0vA*9sTYxiCHx$fahBi8-0YXE?LPY`zc{#<*h(oy+A!IG0ae igm2qGpSY~3&F;Gz&&`KE&36vp6?<+-tsLM$K>h`B;ey<19*{+hZhJ~0^CdGJTUAw4I#z=EEzck(L*J`FcQ&i36nSF zwx*43DcRy4=O6&g$Jb7l2;ro{Ax23oFpSP*>9`B7Bv2b5>2u|7g22{RBRl=7Rn6E!_TL<5n zo$pVz{uOFKO@)d{k@?3L4|ineTgKu7SowMum@jc>e9rkcseHT5v|>DGKC}M1V#7v! zI1I{N#tZV6*Jc1KUF(=e`YOubr& z{VLzIQl3ISmZZPb{BFT!jW615Y#Btgm;r{7`Tb7hn|i;hm(TFws}h$6w25xh!-_ZO z+uIY98MEg*sp{>33UcAQAarAV>J=H|tA_1tptN}qOa#!0`na0cG$`8;+txZ@I&jO> zwxz2V#BT_V9Sc41o&W8oKjd}~*UM6@s7 z8%{)x{&;jSoai4M@^!@HqAJlBud-~NDWm8M_r!$d8w@to3ghP9M022_Dbm`~W~^Uh zB(1fkwQFu`&}8yriRuNONa*1CL;a)y`oV> z0wPi^Is>A!T4<%(3Qw7C_mrG9H zjIY=sOVK62Z-=Ook`So_U&tdr*%Lm7gLb3A=dvjT*=;+vT>`3IaLknARg{)1sk@p| z#m}a#eJ!OGl!Rj%55k#1?ZyE-JIUF8fK^9U&Gwhc#ZAu1l*?tP)v3(T#}IZuL-UfM zdC5@8rG9eTA^pkF@?>ba3!8%li))f|a&_f0<(&skcewOrpqh40-U?8g=F(S7 zd1<~KfdyRE{33F4TSRDmeF!SSbC77A*VJj|l@Zjeo6`!|ec9l7_VK*3^gIk0-*wk} zEzRXqEytfa{`w{R-umda`<@ti{Dx~i-+npy$&Z(Ju3fxo&*oe9y*;q%$l*_F_45uq z^y$HtLx_7H_&JaZ#`e$IF9ovTg23y6w*q^CBS5*R@aqOokoyB#sbslwke^mE^OCjv zWm!XB4J5EUXrHA3kW~iyqLhSS< zf;s}%l0cbz!FB#GKK#~+X8;MjNHC9G=+JYw%-qZ?FD;|n-6s#&#E$27j(iQe5%$}G z_X2kSSzsK?6do0z09jk0EGBds0?UqGtXSnGD-tRepYj@mh$;l|>dqDLr;Y$NVlGlj zWj0@KTvBKDYp!ilCHp^j(=X2y?o-kxn?H9ZrI9N5$TpZ73`begAg5H)C?`9?CeQgy z$S%*2EMT7mz$Fu=mB{`B_=nxn%xCwii23YwIqdB@?4vpCR_SPWwF+%piB?jW=bAta zH+Cs--7hSj)2G$^g{b$GJZ!tB$oiQ`zeb?zSJO|;V@|(b_=yGh@!oezz4zbp9fIG? z0{p&$--!kI@$;R|;rA?ZIfM^SP1An&6p?U=f!cf*Bbd=g&H4jp_iDPQ;2WoX(>r>Z z{le??CA0eZu0?vqtiBq=KdWB`5}ef=Kti+jO|!b&eqm5|Y}AF*ev2!p+X`OMg{v+H zZPZs5yll(I2=UTafoSWMPl5s}@5aLcdNU|SR(S;|{3`hy0Ii~Ox15l0_9*I8^e5BL zc~H@N6unr{^A(*`beE!|inc3Sr>Iv^5We4em7-zLVr^8kLrGwM%5);!0Ho|yGXH;} zJPk^y0aC70b{=PxN0m%ctaz~aAuc +bool operator<(const T&, const T&){ + return true; +} + +template +bool operator>(const T&, const T&){ + return true; +} + +template +bool operator<<(const T&, const T&){ + return true; +} + +template +bool operator>>(const T&, const T&){ + return true; +} + +template +bool operator==(const T&, const T&){ + return true; +} + +struct B{}; + +struct D{}; + +template +bool operator<=>(const T&,const T&){ return true;} + +int main() { + B b1; + B b2; + D d1; + D d2; + + return b1 < b2 && b1 > b2 && b1 << b2 && b1 >> b2 && b1 == b2 && d1 <=> d2; +} +$ clang++ -std=c++2a -g template_operators.cpp -c -o template_operators.o +$ clang template_operators.o -o template_operators + + +NAMES-DAG: "operator<" +NAMES-DAG: "operator<" +NAMES-DAG: "operator>" +NAMES-DAG: "operator>" +NAMES-DAG: "operator<<" +NAMES-DAG: "operator<<" +NAMES-DAG: "operator>>" +NAMES-DAG: "operator>>" +NAMES-DAG: "operator<=>" +NAMES-DAG: "operator<=>" +NAMES-DAG: "operator==" +NAMES-DAG: "operator==" -- GitLab