<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">We are running into a problem created by renaming of static symbols by llvm-link.  It first
<o:p></o:p></p>
<p class="MsoNormal">showed up using LTO, but we can illustrate this by using llvm-link as well.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Say we have two files with the same named static symbol Bye<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">--------------- t1.cpp ---------<o:p></o:p></p>
<p class="MsoNormal">static void Bye(int* ba1) { ba1[0] /= ba1[2] - 2; }<o:p></o:p></p>
<p class="MsoNormal">void main_a( int* inB) { void (*func)(int*) = Bye; func(inB); }<o:p></o:p></p>
<p class="MsoNormal">--------------- t2.cpp ---------<o:p></o:p></p>
<p class="MsoNormal">static void Bye(int* ba1) { ba1[0] *= ba1[2] + 2; }<o:p></o:p></p>
<p class="MsoNormal">void main_b( int* inB) { void (*func)(int*) = Bye; func(inB+1); }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">--------- cmd sequence -------<o:p></o:p></p>
<p class="MsoNormal">$ clang++ -c -emit-llvm t1.cpp -o t1.bc<o:p></o:p></p>
<p class="MsoNormal">$ clang++ -c -emit-llvm t1.cpp -o t2.bc<o:p></o:p></p>
<p class="MsoNormal">$ llvm-link t1.bc t2.bc -o t23.bc<o:p></o:p></p>
<p class="MsoNormal">$ clang -c t23.bc<o:p></o:p></p>
<p class="MsoNormal">$ nm t23.o<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">t1.o and t2.o have the same named function “_ZL3ByePi”. In order to distinguish them,
<o:p></o:p></p>
<p class="MsoNormal">one gets a ‘1’ appended to it, making it  “_ZL3ByePi1”.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">While the code is all correct, the problem is that this modified name cannot be demangled.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">That is what I am trying to fix. <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In similar situations gcc appends a ‘.’ before appending the discriminating number, making “_ZL3ByePi.1”<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The following change in lib/IR/ValueSymbolTable.cpp seems to fix this problem.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">------------ start diff -------------------<o:p></o:p></p>
<p class="MsoNormal">@@ -54,5 +54,5 @@ void ValueSymbolTable::reinsertValue(Value* V) {<o:p></o:p></p>
<p class="MsoNormal">     // Trim any suffix off and append the next number.<o:p></o:p></p>
<p class="MsoNormal">     UniqueName.resize(BaseSize);<o:p></o:p></p>
<p class="MsoNormal">-    raw_svector_ostream(UniqueName) << ++LastUnique;<o:p></o:p></p>
<p class="MsoNormal">+    raw_svector_ostream(UniqueName) <<  "."  << ++LastUnique;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">     // Try insert the vmap entry with this suffix.<o:p></o:p></p>
<p class="MsoNormal">-------------- end diff ---------------------<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">However it causes 60 test failures. These are tests where some names that are expecting
<o:p></o:p></p>
<p class="MsoNormal">to get a plain numeric suffix now have a ‘.’ before it. These are all local symbols, so I think<o:p></o:p></p>
<p class="MsoNormal">the generated code will always be correct, but the tests as written do not pass. For
<o:p></o:p></p>
<p class="MsoNormal">example, take test/CodeGen/ARM/global-merge-addrspace.ll<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; RUN: llc < %s -mtriple=thumb-apple-darwin -O3 | FileCheck %s<o:p></o:p></p>
<p class="MsoNormal">; Test the GlobalMerge pass. Check that the pass does not crash when using<o:p></o:p></p>
<p class="MsoNormal">; multiple address spaces.<o:p></o:p></p>
<p class="MsoNormal">; CHECK: _MergedGlobals:<o:p></o:p></p>
<p class="MsoNormal">@g1 = internal addrspace(1) global i32 1<o:p></o:p></p>
<p class="MsoNormal">@g2 = internal addrspace(1) global i32 2<o:p></o:p></p>
<p class="MsoNormal">; CHECK: _MergedGlobals1:<o:p></o:p></p>
<p class="MsoNormal">@g3 = internal addrspace(2) global i32 3<o:p></o:p></p>
<p class="MsoNormal">@g4 = internal addrspace(2) global i32 4<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">With my change, the symbol is named MergedGlobals.1, hence it fails this test.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I could change these 60 tests to match the new behavior. That will fix these 60 failures.
<o:p></o:p></p>
<p class="MsoNormal">However, I do have a concern that there may be other places in llvm that expect the
<o:p></o:p></p>
<p class="MsoNormal">names to be pure identifiers. Adding a ‘.’ may cause them to fail. No such failure has been
<o:p></o:p></p>
<p class="MsoNormal">seen in running the whole clang test, but the concern is still there.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I should note that even local symbols are treated similarly, so for example, a parameter
<o:p></o:p></p>
<p class="MsoNormal">named ‘str’ becomes ‘str.1’ with my change, instead of ‘str1’ currently (an actual
<o:p></o:p></p>
<p class="MsoNormal">example from a test).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Alternatively, I could try to limit my change to just mangled names.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Any suggestion about how this should be fixed ?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There is another similar change about 40 lines below in ValueSymbolTable::createValueName().
<o:p></o:p></p>
<p class="MsoNormal">That is not needed to fix this particular problem, but looks similar, so perhaps should be treated
<o:p></o:p></p>
<p class="MsoNormal">similarly for consistency. It causes 66 more failures of the same nature though.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Sunil Srivastava<o:p></o:p></p>
<p class="MsoNormal">Sony Computer Entertainment<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>