<div dir="ltr">Yep: <a href="http://llvm.org/bugs/show_bug.cgi?id=16080">http://llvm.org/bugs/show_bug.cgi?id=16080</a><div><br></div><div style>I forgot about the dependency, and wasn't aware of the intervening linkage changes.</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 21, 2013 at 8:00 AM, NAKAMURA Takumi <span dir="ltr"><<a href="mailto:geek4civic@gmail.com" target="_blank">geek4civic@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Bill and Reid, it depends on r181677 and r182096. release_33 has been broken.<br>
<br>
SemaDeclAttr.cpp: In function ‘void handleSelectAnyAttr(clang::Sema&,<br>
clang::Decl*, const clang::AttributeList&)’:<br>
SemaDeclAttr.cpp:4687:33: error: ‘checkMicrosoftExt’ was not declared<br>
in this scope<br>
<br>
SemaDecl.cpp: In function ‘void<br>
checkAttributesAfterMerging(clang::Sema&, clang::NamedDecl&)’:<br>
SemaDecl.cpp:4645:38: error: ‘class clang::NamedDecl’ has no member<br>
named ‘isExternallyVisible’<br>
<br>
...Takumi<br>
<br>
<br>
2013/5/21 Bill Wendling <<a href="mailto:isanbard@gmail.com">isanbard@gmail.com</a>>:<br>
> Author: void<br>
> Date: Mon May 20 19:06:11 2013<br>
> New Revision: 182337<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=182337&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=182337&view=rev</a><br>
> Log:<br>
> Merging r182266:<br>
> ------------------------------------------------------------------------<br>
> r182266 | rnk | 2013-05-20 07:02:37 -0700 (Mon, 20 May 2013) | 13 lines<br>
><br>
> Implement __declspec(selectany) under -fms-extensions<br>
><br>
> selectany only applies to externally visible global variables.  It has<br>
> the effect of making the data weak_odr.<br>
><br>
> The MSDN docs suggest that unused definitions can only be dropped at<br>
> linktime, so Clang uses weak instead of linkonce.  MSVC optimizes away<br>
> references to constant selectany data, so it must assume that there is<br>
> only one definition, hence weak_odr.<br>
><br>
> Reviewers: espindola<br>
><br>
> Differential Revision: <a href="http://llvm-reviews.chandlerc.com/D814" target="_blank">http://llvm-reviews.chandlerc.com/D814</a><br>
> ------------------------------------------------------------------------<br>
><br>
> Added:<br>
>     cfe/branches/release_33/test/SemaCXX/attr-selectany.cpp<br>
>       - copied unchanged from r182266, cfe/trunk/test/SemaCXX/attr-selectany.cpp<br>
> Modified:<br>
>     cfe/branches/release_33/   (props changed)<br>
>     cfe/branches/release_33/include/clang/Basic/Attr.td<br>
>     cfe/branches/release_33/include/clang/Basic/DiagnosticSemaKinds.td<br>
>     cfe/branches/release_33/lib/CodeGen/CodeGenModule.cpp<br>
>     cfe/branches/release_33/lib/Sema/SemaDecl.cpp<br>
>     cfe/branches/release_33/lib/Sema/SemaDeclAttr.cpp<br>
>     cfe/branches/release_33/test/CodeGen/ms-declspecs.c<br>
><br>
> Propchange: cfe/branches/release_33/<br>
> ------------------------------------------------------------------------------<br>
> --- svn:mergeinfo (original)<br>
> +++ svn:mergeinfo Mon May 20 19:06:11 2013<br>
> @@ -1,4 +1,4 @@<br>
>  /cfe/branches/type-system-rewrite:134693-134817<br>
> -/cfe/trunk:181286,181299,181368,181465,181728,181750,181909,182072<br>
> +/cfe/trunk:181286,181299,181368,181465,181728,181750,181909,182072,182266<br>
>  /cfe/trunk/test:170344<br>
>  /cfe/trunk/test/SemaTemplate:126920<br>
><br>
> Modified: cfe/branches/release_33/include/clang/Basic/Attr.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/include/clang/Basic/Attr.td?rev=182337&r1=182336&r2=182337&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/include/clang/Basic/Attr.td?rev=182337&r1=182336&r2=182337&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/branches/release_33/include/clang/Basic/Attr.td (original)<br>
> +++ cfe/branches/release_33/include/clang/Basic/Attr.td Mon May 20 19:06:11 2013<br>
> @@ -948,6 +948,10 @@ def ForceInline : InheritableAttr {<br>
>    let Spellings = [Keyword<"__forceinline">];<br>
>  }<br>
><br>
> +def SelectAny : InheritableAttr {<br>
> +  let Spellings = [Declspec<"selectany">];<br>
> +}<br>
> +<br>
>  def Win64 : InheritableAttr {<br>
>    let Spellings = [Keyword<"__w64">];<br>
>  }<br>
><br>
> Modified: cfe/branches/release_33/include/clang/Basic/DiagnosticSemaKinds.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/include/clang/Basic/DiagnosticSemaKinds.td?rev=182337&r1=182336&r2=182337&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/include/clang/Basic/DiagnosticSemaKinds.td?rev=182337&r1=182336&r2=182337&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/branches/release_33/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
> +++ cfe/branches/release_33/include/clang/Basic/DiagnosticSemaKinds.td Mon May 20 19:06:11 2013<br>
> @@ -1948,6 +1948,8 @@ def warn_weak_identifier_undeclared : Wa<br>
>    "weak identifier %0 never declared">;<br>
>  def err_attribute_weak_static : Error<<br>
>    "weak declaration cannot have internal linkage">;<br>
> +def err_attribute_selectany_non_extern_data : Error<<br>
> +  "'selectany' can only be applied to data items with external linkage">;<br>
>  def warn_attribute_weak_import_invalid_on_definition : Warning<<br>
>    "'weak_import' attribute cannot be specified on a definition">,<br>
>    InGroup<IgnoredAttributes>;<br>
><br>
> Modified: cfe/branches/release_33/lib/CodeGen/CodeGenModule.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/lib/CodeGen/CodeGenModule.cpp?rev=182337&r1=182336&r2=182337&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/lib/CodeGen/CodeGenModule.cpp?rev=182337&r1=182336&r2=182337&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/branches/release_33/lib/CodeGen/CodeGenModule.cpp (original)<br>
> +++ cfe/branches/release_33/lib/CodeGen/CodeGenModule.cpp Mon May 20 19:06:11 2013<br>
> @@ -1900,7 +1900,13 @@ CodeGenModule::GetLLVMLinkageVarDefiniti<br>
>      return llvm::Function::DLLImportLinkage;<br>
>    else if (D->hasAttr<DLLExportAttr>())<br>
>      return llvm::Function::DLLExportLinkage;<br>
> -  else if (D->hasAttr<WeakAttr>()) {<br>
> +  else if (D->hasAttr<SelectAnyAttr>()) {<br>
> +    // selectany symbols are externally visible, so use weak instead of<br>
> +    // linkonce.  MSVC optimizes away references to const selectany globals, so<br>
> +    // all definitions should be the same and ODR linkage should be used.<br>
> +    // <a href="http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/5tkz6s71.aspx</a><br>
> +    return llvm::GlobalVariable::WeakODRLinkage;<br>
> +  } else if (D->hasAttr<WeakAttr>()) {<br>
>      if (GV->isConstant())<br>
>        return llvm::GlobalVariable::WeakODRLinkage;<br>
>      else<br>
><br>
> Modified: cfe/branches/release_33/lib/Sema/SemaDecl.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/lib/Sema/SemaDecl.cpp?rev=182337&r1=182336&r2=182337&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/lib/Sema/SemaDecl.cpp?rev=182337&r1=182336&r2=182337&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/branches/release_33/lib/Sema/SemaDecl.cpp (original)<br>
> +++ cfe/branches/release_33/lib/Sema/SemaDecl.cpp Mon May 20 19:06:11 2013<br>
> @@ -4638,6 +4638,15 @@ static void checkAttributesAfterMerging(<br>
>        ND.dropAttr<WeakRefAttr>();<br>
>      }<br>
>    }<br>
> +<br>
> +  // 'selectany' only applies to externally visible varable declarations.<br>
> +  // It does not apply to functions.<br>
> +  if (SelectAnyAttr *Attr = ND.getAttr<SelectAnyAttr>()) {<br>
> +    if (isa<FunctionDecl>(ND) || !ND.isExternallyVisible()) {<br>
> +      S.Diag(Attr->getLocation(), diag::err_attribute_selectany_non_extern_data);<br>
> +      ND.dropAttr<SelectAnyAttr>();<br>
> +    }<br>
> +  }<br>
>  }<br>
><br>
>  /// Given that we are within the definition of the given function,<br>
><br>
> Modified: cfe/branches/release_33/lib/Sema/SemaDeclAttr.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/lib/Sema/SemaDeclAttr.cpp?rev=182337&r1=182336&r2=182337&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/lib/Sema/SemaDeclAttr.cpp?rev=182337&r1=182336&r2=182337&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/branches/release_33/lib/Sema/SemaDeclAttr.cpp (original)<br>
> +++ cfe/branches/release_33/lib/Sema/SemaDeclAttr.cpp Mon May 20 19:06:11 2013<br>
> @@ -4683,6 +4683,16 @@ static void handleForceInlineAttr(Sema &<br>
>      S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();<br>
>  }<br>
><br>
> +static void handleSelectAnyAttr(Sema &S, Decl *D, const AttributeList &Attr) {<br>
> +  if (!checkMicrosoftExt(S, Attr))<br>
> +    return;<br>
> +  // Check linkage after possibly merging declaratinos.  See<br>
> +  // checkAttributesAfterMerging().<br>
> +  D->addAttr(::new (S.Context)<br>
> +             SelectAnyAttr(Attr.getRange(), S.Context,<br>
> +                           Attr.getAttributeSpellingListIndex()));<br>
> +}<br>
> +<br>
>  //===----------------------------------------------------------------------===//<br>
>  // Top Level Sema Entry Points<br>
>  //===----------------------------------------------------------------------===//<br>
> @@ -4909,6 +4919,9 @@ static void ProcessInheritableDeclAttr(S<br>
>    case AttributeList::AT_ForceInline:<br>
>      handleForceInlineAttr(S, D, Attr);<br>
>      break;<br>
> +  case AttributeList::AT_SelectAny:<br>
> +    handleSelectAnyAttr(S, D, Attr);<br>
> +    break;<br>
><br>
>    // Thread safety attributes:<br>
>    case AttributeList::AT_GuardedVar:<br>
><br>
> Modified: cfe/branches/release_33/test/CodeGen/ms-declspecs.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/test/CodeGen/ms-declspecs.c?rev=182337&r1=182336&r2=182337&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/branches/release_33/test/CodeGen/ms-declspecs.c?rev=182337&r1=182336&r2=182337&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/branches/release_33/test/CodeGen/ms-declspecs.c (original)<br>
> +++ cfe/branches/release_33/test/CodeGen/ms-declspecs.c Mon May 20 19:06:11 2013<br>
> @@ -1,5 +1,10 @@<br>
>  // RUN: %clang_cc1 -triple i386-pc-win32 %s -emit-llvm -fms-compatibility -o - | FileCheck %s<br>
><br>
> +__declspec(selectany) int x1 = 1;<br>
> +const __declspec(selectany) int x2 = 2;<br>
> +// CHECK: @x1 = weak_odr global i32 1, align 4<br>
> +// CHECK: @x2 = weak_odr constant i32 2, align 4<br>
> +<br>
>  struct __declspec(align(16)) S {<br>
>    char x;<br>
>  };<br>
><br>
><br>
> _______________________________________________<br>
> llvm-branch-commits mailing list<br>
> <a href="mailto:llvm-branch-commits@cs.uiuc.edu">llvm-branch-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-branch-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-branch-commits</a><br>
</blockquote></div><br></div>