r240653 - Fix #pragma redefine_extname when there is a local variable of the same name. The local should not be renamed, only the externally-available declaration should be.
Richard Smith
richard at metafoo.co.uk
Thu Jun 25 14:43:57 PDT 2015
On Thu, Jun 25, 2015 at 8:37 AM, Aaron Ballman <aaron at aaronballman.com>
wrote:
> Author: aaronballman
> Date: Thu Jun 25 10:37:16 2015
> New Revision: 240653
>
> URL: http://llvm.org/viewvc/llvm-project?rev=240653&view=rev
> Log:
> Fix #pragma redefine_extname when there is a local variable of the same
> name. The local should not be renamed, only the externally-available
> declaration should be.
>
> Patch by Andrey Bokhanko!
>
> Modified:
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/test/CodeGen/redefine_extname.c
> cfe/trunk/test/CodeGenCXX/redefine_extname.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=240653&r1=240652&r2=240653&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Jun 25 10:37:16 2015
> @@ -5525,6 +5525,19 @@ bool Sema::adjustContextForLocalExternDe
> return true;
> }
>
> +/// \brief Returns true if given declaration is TU-scoped and externally
> +/// visible.
> +static bool isDeclTUScopedExternallyVisible(const Decl *D) {
> + if (auto *FD = dyn_cast<FunctionDecl>(D))
> + return (FD->getDeclContext()->isTranslationUnit() || FD->isExternC())
> &&
> + FD->hasExternalFormalLinkage();
>
Hmm, should non-extern-C functions get this behavior at all in C++? My
understanding is that redefine_extname is supposed to have the semantics of
"search and replace on the generated assembly", so it should only apply to
names that don't get mangled.
> + else if (auto *VD = dyn_cast<VarDecl>(D))
> + return (VD->getDeclContext()->isTranslationUnit() || VD->isExternC())
> &&
> + VD->hasExternalFormalLinkage();
> +
> + llvm_unreachable("Unknown type of decl!");
> +}
> +
> NamedDecl *
> Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
> TypeSourceInfo *TInfo, LookupResult
> &Previous,
> @@ -5949,7 +5962,8 @@ Sema::ActOnVariableDeclarator(Scope *S,
>
> NewVD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0),
> Context, Label, 0));
> - } else if (!ExtnameUndeclaredIdentifiers.empty()) {
> + } else if (!ExtnameUndeclaredIdentifiers.empty() &&
> + isDeclTUScopedExternallyVisible(NewVD)) {
> llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
> ExtnameUndeclaredIdentifiers.find(NewVD->getIdentifier());
> if (I != ExtnameUndeclaredIdentifiers.end()) {
> @@ -7471,7 +7485,8 @@ Sema::ActOnFunctionDeclarator(Scope *S,
> StringLiteral *SE = cast<StringLiteral>(E);
> NewFD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0),
> Context,
> SE->getString(), 0));
> - } else if (!ExtnameUndeclaredIdentifiers.empty()) {
> + } else if (!ExtnameUndeclaredIdentifiers.empty() &&
> + isDeclTUScopedExternallyVisible(NewFD)) {
> llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
> ExtnameUndeclaredIdentifiers.find(NewFD->getIdentifier());
> if (I != ExtnameUndeclaredIdentifiers.end()) {
>
> Modified: cfe/trunk/test/CodeGen/redefine_extname.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/redefine_extname.c?rev=240653&r1=240652&r2=240653&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/redefine_extname.c (original)
> +++ cfe/trunk/test/CodeGen/redefine_extname.c Thu Jun 25 10:37:16 2015
> @@ -13,3 +13,14 @@ int fish() { return fake() + __PRAGMA_RE
> // CHECK: call i32 @real()
> // Check that this also works with variables names
> // CHECK: load i32, i32* @alias
> +
> +// This is a case when redefenition is deferred *and* we have a local of
> the
> +// same name. PR23923.
> +#pragma redefine_extname foo bar
> +int f() {
> + int foo = 0;
> + return foo;
> +}
> +extern int foo() { return 1; }
> +// CHECK: define i32 @bar()
> +
>
> Modified: cfe/trunk/test/CodeGenCXX/redefine_extname.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/redefine_extname.cpp?rev=240653&r1=240652&r2=240653&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/redefine_extname.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/redefine_extname.cpp Thu Jun 25 10:37:16 2015
> @@ -8,7 +8,7 @@ extern "C" {
> int statvfs64(struct statvfs64 *);
> }
>
> -void foo() {
> +void some_func() {
> struct statvfs64 st;
> statvfs64(&st);
> // Check that even if there is a structure with redefined name before the
> @@ -16,3 +16,15 @@ void foo() {
> // CHECK: call i32 @statvfs(%struct.statvfs64* %st)
> }
>
> +// This is a case when redefenition is deferred *and* we have a local of
> the
> +// same name. PR23923.
> +#pragma redefine_extname foo bar
> +int f() {
> + int foo = 0;
> + return foo;
> +}
> +extern "C" {
> + int foo() { return 1; }
> +// CHECK: define i32 @bar()
> +}
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150625/5fdf59af/attachment.html>
More information about the cfe-commits
mailing list