[PATCH] PR5172: Fix for a bug in pragma redefine_extname implementation.

Andrey Bokhanko andreybokhanko at gmail.com
Wed Jun 3 02:02:32 PDT 2015


Aaron, thank you for the review. I did as you suggested; patch updated.


http://reviews.llvm.org/D10187

Files:
  lib/Sema/SemaDecl.cpp
  test/CodeGen/redefine_extname.c

Index: test/CodeGen/redefine_extname.c
===================================================================
--- test/CodeGen/redefine_extname.c
+++ test/CodeGen/redefine_extname.c
@@ -3,6 +3,12 @@
 #pragma redefine_extname fake real
 #pragma redefine_extname name alias
 
+struct statvfs64 {
+  int f;
+};
+#pragma redefine_extname statvfs64 statvfs
+int statvfs64(struct statvfs64 *);
+
 extern int fake(void);
 
 int name;
@@ -13,3 +19,12 @@
 // CHECK:   call i32 @real()
 // Check that this also works with variables names
 // CHECK:   load i32, i32* @alias
+
+void foo() {
+  struct statvfs64 st;
+  statvfs64(&st);
+// Check that even if there is a structure with redefined name before the
+// pragma, subsequent function name redefined properly. PR5712, Comment 11.
+// CHECK:  call i32 @statvfs(%struct.statvfs64* %st)
+}
+
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -14199,14 +14199,16 @@
                                       SourceLocation AliasNameLoc) {
   Decl *PrevDecl = LookupSingleName(TUScope, Name, NameLoc,
                                     LookupOrdinaryName);
-  AsmLabelAttr *Attr = ::new (Context) AsmLabelAttr(AliasNameLoc, Context,
-                                                    AliasName->getName(), 0);
+  if (PrevDecl) {
+    PrevDecl->addAttr(AsmLabelAttr::CreateImplicit(
+        Context, AliasName->getName(), AliasNameLoc));
+  }
 
-  if (PrevDecl) 
-    PrevDecl->addAttr(Attr);
-  else 
-    (void)ExtnameUndeclaredIdentifiers.insert(
-      std::pair<IdentifierInfo*,AsmLabelAttr*>(Name, Attr));
+  // There might be additional not yet declared identifiers with Name name.
+  // PR5172, Comment 11.
+  (void)ExtnameUndeclaredIdentifiers.insert(
+      std::make_pair(Name, AsmLabelAttr::CreateImplicit(
+                               Context, AliasName->getName(), AliasNameLoc)));
 }
 
 void Sema::ActOnPragmaWeakID(IdentifierInfo* Name,

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10187.27027.patch
Type: text/x-patch
Size: 1995 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150603/051c06b4/attachment.bin>


More information about the cfe-commits mailing list