Hi Bill,<div><br></div><div>It's not clear to me what this new bit actually means. How should I treat this in the gold plugin? What does it do in ELF?</div><div><br></div><div>Looking at the LangRef, it's not clear to me that linker_private_weak_def_auto is a good orthogonal abstraction either. It makes sense if you really do have a language feature where taking the address doesn't preserve the uniqueness of the address, but the two cases I'm interested in are C strings (where this is true, but the linkage type isn't obviously "linker_private_weak") and virtual functions (whose addresses appear in the vtable constant, but those addresses are never compared, only called through).</div>

<div><br></div><div>I realize this is solving a real problem for you, but would you mind taking a minute to explain what's going on? The example in the LangRef sounds like it would be solved with "available_externally" linkage, for example, could it?</div>

<div><br></div><div>Nick<br><div><br><div class="gmail_quote">On 27 September 2010 13:17, Bill Wendling <span dir="ltr"><<a href="mailto:isanbard@gmail.com">isanbard@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Author: void<br>
Date: Mon Sep 27 15:17:45 2010<br>
New Revision: 114868<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=114868&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=114868&view=rev</a><br>
Log:<br>
Add a new scope type "LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN" for the<br>
"linker_private_weak_auto_def" linkage type for LTO.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm-c/lto.h<br>
    llvm/trunk/tools/lto/LTOModule.cpp<br>
<br>
Modified: llvm/trunk/include/llvm-c/lto.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=114868&r1=114867&r2=114868&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=114868&r1=114867&r2=114868&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/include/llvm-c/lto.h (original)<br>
+++ llvm/trunk/include/llvm-c/lto.h Mon Sep 27 15:17:45 2010<br>
@@ -20,25 +20,26 @@<br>
 #include <stddef.h><br>
 #include "llvm/System/DataTypes.h"<br>
<br>
-#define LTO_API_VERSION 3<br>
+#define LTO_API_VERSION 4<br>
<br>
 typedef enum {<br>
-    LTO_SYMBOL_ALIGNMENT_MASK         = 0x0000001F,    /* log2 of alignment */<br>
-    LTO_SYMBOL_PERMISSIONS_MASK       = 0x000000E0,<br>
-    LTO_SYMBOL_PERMISSIONS_CODE       = 0x000000A0,<br>
-    LTO_SYMBOL_PERMISSIONS_DATA       = 0x000000C0,<br>
-    LTO_SYMBOL_PERMISSIONS_RODATA     = 0x00000080,<br>
-    LTO_SYMBOL_DEFINITION_MASK        = 0x00000700,<br>
-    LTO_SYMBOL_DEFINITION_REGULAR     = 0x00000100,<br>
-    LTO_SYMBOL_DEFINITION_TENTATIVE   = 0x00000200,<br>
-    LTO_SYMBOL_DEFINITION_WEAK        = 0x00000300,<br>
-    LTO_SYMBOL_DEFINITION_UNDEFINED   = 0x00000400,<br>
-    LTO_SYMBOL_DEFINITION_WEAKUNDEF   = 0x00000500,<br>
-    LTO_SYMBOL_SCOPE_MASK             = 0x00003800,<br>
-    LTO_SYMBOL_SCOPE_INTERNAL         = 0x00000800,<br>
-    LTO_SYMBOL_SCOPE_HIDDEN           = 0x00001000,<br>
-    LTO_SYMBOL_SCOPE_PROTECTED        = 0x00002000,<br>
-    LTO_SYMBOL_SCOPE_DEFAULT          = 0x00001800<br>
+    LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F, /* log2 of alignment */<br>
+    LTO_SYMBOL_PERMISSIONS_MASK            = 0x000000E0,<br>
+    LTO_SYMBOL_PERMISSIONS_CODE            = 0x000000A0,<br>
+    LTO_SYMBOL_PERMISSIONS_DATA            = 0x000000C0,<br>
+    LTO_SYMBOL_PERMISSIONS_RODATA          = 0x00000080,<br>
+    LTO_SYMBOL_DEFINITION_MASK             = 0x00000700,<br>
+    LTO_SYMBOL_DEFINITION_REGULAR          = 0x00000100,<br>
+    LTO_SYMBOL_DEFINITION_TENTATIVE        = 0x00000200,<br>
+    LTO_SYMBOL_DEFINITION_WEAK             = 0x00000300,<br>
+    LTO_SYMBOL_DEFINITION_UNDEFINED        = 0x00000400,<br>
+    LTO_SYMBOL_DEFINITION_WEAKUNDEF        = 0x00000500,<br>
+    LTO_SYMBOL_SCOPE_MASK                  = 0x00003800,<br>
+    LTO_SYMBOL_SCOPE_INTERNAL              = 0x00000800,<br>
+    LTO_SYMBOL_SCOPE_HIDDEN                = 0x00001000,<br>
+    LTO_SYMBOL_SCOPE_PROTECTED             = 0x00002000,<br>
+    LTO_SYMBOL_SCOPE_DEFAULT               = 0x00001800,<br>
+    LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800<br>
 } lto_symbol_attributes;<br>
<br>
 typedef enum {<br>
<br>
Modified: llvm/trunk/tools/lto/LTOModule.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOModule.cpp?rev=114868&r1=114867&r2=114868&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOModule.cpp?rev=114868&r1=114867&r2=114868&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/tools/lto/LTOModule.cpp (original)<br>
+++ llvm/trunk/tools/lto/LTOModule.cpp Mon Sep 27 15:17:45 2010<br>
@@ -327,24 +327,24 @@<br>
   // set definition part<br>
   if (def->hasWeakLinkage() || def->hasLinkOnceLinkage() ||<br>
       def->hasLinkerPrivateWeakLinkage() ||<br>
-      def->hasLinkerPrivateWeakDefAutoLinkage()) {<br>
+      def->hasLinkerPrivateWeakDefAutoLinkage())<br>
     attr |= LTO_SYMBOL_DEFINITION_WEAK;<br>
-  }<br>
-  else if (def->hasCommonLinkage()) {<br>
+  else if (def->hasCommonLinkage())<br>
     attr |= LTO_SYMBOL_DEFINITION_TENTATIVE;<br>
-  }<br>
-  else {<br>
+  else<br>
     attr |= LTO_SYMBOL_DEFINITION_REGULAR;<br>
-  }<br>
<br>
   // set scope part<br>
   if (def->hasHiddenVisibility())<br>
     attr |= LTO_SYMBOL_SCOPE_HIDDEN;<br>
   else if (def->hasProtectedVisibility())<br>
     attr |= LTO_SYMBOL_SCOPE_PROTECTED;<br>
-  else if (def->hasExternalLinkage() || def->hasWeakLinkage()<br>
-           || def->hasLinkOnceLinkage() || def->hasCommonLinkage())<br>
+  else if (def->hasExternalLinkage() || def->hasWeakLinkage() ||<br>
+           def->hasLinkOnceLinkage() || def->hasCommonLinkage() ||<br>
+           def->hasLinkerPrivateWeakLinkage())<br>
     attr |= LTO_SYMBOL_SCOPE_DEFAULT;<br>
+  else if (def->hasLinkerPrivateWeakDefAutoLinkage())<br>
+    attr |= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN;<br>
   else<br>
     attr |= LTO_SYMBOL_SCOPE_INTERNAL;<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></div>