r314262 - Emit section information for extern variables.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 4 12:59:02 PDT 2017


Hi Erich,

this breaks existing code. NaCl does this:

#include <link.h>
struct r_debug _r_debug __attribute__((nocommon, section(".r_debug")));

(There's a lengthy-ish comment for why in
https://cs.chromium.org/chromium/src/native_client/src/trusted/service_runtime/linux/nacl_bootstrap.c?q=nacl_bootstrap.c&sq=package:chromium&dr&l=424
)

link.h in e.g. the debian jessie sysroot says:
extern struct r_debug _r_debug;

After this change, clang complains:

../../native_client/src/trusted/service_runtime/linux/nacl_bootstrap.c:434:16:
error: section attribute is specified on redeclared variable
[-Werror,-Wsection]
struct r_debug _r_debug __attribute__((nocommon, section(".r_debug")));
               ^
../../build/linux/debian_jessie_amd64-sysroot/usr/include/link.h:67:23:
note: previous declaration is here
extern struct r_debug _r_debug;


This code used to work in clang, and continues to work in gcc. So this
patch probably isn't quite the right approach. Ideas?

On Tue, Sep 26, 2017 at 7:42 PM, Erich Keane via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: erichkeane
> Date: Tue Sep 26 16:42:34 2017
> New Revision: 314262
>
> URL: http://llvm.org/viewvc/llvm-project?rev=314262&view=rev
> Log:
> Emit section information for extern variables.
>
> Currently, if _attribute_((section())) is used for extern variables,
> section information is not emitted in generated IR when the variables are
> used.
> This is expected since sections are not generated for external linkage
> objects.
> However NiosII requires this information as it uses special GP-relative
> accesses
> for any objects that use attribute section (.sdata). GCC keeps this
> attribute in
>   middle-end.
>
> This change emits the section information for all targets.
>
> Patch By: Elizabeth Andrews
>
> Differential Revision:https://reviews.llvm.org/D36487
>
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/test/Sema/attr-section.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
> DiagnosticSemaKinds.td?rev=314262&r1=314261&r2=314262&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Sep 26
> 16:42:34 2017
> @@ -2620,6 +2620,8 @@ def err_attribute_section_invalid_for_ta
>    "argument to 'section' attribute is not valid for this target: %0">;
>  def warn_mismatched_section : Warning<
>    "section does not match previous declaration">, InGroup<Section>;
> +def warn_attribute_section_on_redeclaration : Warning<
> +  "section attribute is specified on redeclared variable">,
> InGroup<Section>;
>
>  def err_anonymous_property: Error<
>    "anonymous property is not supported">;
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenModule.cpp?rev=314262&r1=314261&r2=314262&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Sep 26 16:42:34 2017
> @@ -2432,6 +2432,12 @@ CodeGenModule::GetOrCreateLLVMGlobal(Str
>        EmitGlobalVarDefinition(D);
>      }
>
> +    // Emit section information for extern variables.
> +    if (D->hasExternalStorage()) {
> +      if (const SectionAttr *SA = D->getAttr<SectionAttr>())
> +        GV->setSection(SA->getName());
> +    }
> +
>      // Handle XCore specific ABI requirements.
>      if (getTriple().getArch() == llvm::Triple::xcore &&
>          D->getLanguageLinkage() == CLanguageLinkage &&
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaDecl.cpp?rev=314262&r1=314261&r2=314262&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Sep 26 16:42:34 2017
> @@ -2607,6 +2607,16 @@ void Sema::mergeDeclAttributes(NamedDecl
>      }
>    }
>
> +  // This redeclaration adds a section attribute.
> +  if (New->hasAttr<SectionAttr>() && !Old->hasAttr<SectionAttr>()) {
> +    if (auto *VD = dyn_cast<VarDecl>(New)) {
> +      if (VD->isThisDeclarationADefinition() != VarDecl::Definition) {
> +        Diag(New->getLocation(), diag::warn_attribute_section_
> on_redeclaration);
> +        Diag(Old->getLocation(), diag::note_previous_declaration);
> +      }
> +    }
> +  }
> +
>    if (!Old->hasAttrs())
>      return;
>
>
> Modified: cfe/trunk/test/Sema/attr-section.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/
> attr-section.c?rev=314262&r1=314261&r2=314262&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Sema/attr-section.c (original)
> +++ cfe/trunk/test/Sema/attr-section.c Tue Sep 26 16:42:34 2017
> @@ -19,3 +19,7 @@ void __attribute__((section("foo,zed")))
>  void __attribute__((section("bar,zed"))) test2(void) {} //
> expected-warning {{section does not match previous declaration}}
>
>  enum __attribute__((section("NEAR,x"))) e { one }; // expected-error
> {{'section' attribute only applies to functions, methods, properties, and
> global variables}}
> +
> +extern int a; // expected-note {{previous declaration is here}}
> +int *b = &a;
> +extern int a __attribute__((section("foo,zed"))); // expected-warning
> {{section attribute is specified on redeclared variable}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171004/dae6b9b3/attachment.html>


More information about the cfe-commits mailing list