]> granicus.if.org Git - clang/commitdiff
llvm-gcc treats a tentative definition with a previous
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 20 Jun 2011 17:50:03 +0000 (17:50 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 20 Jun 2011 17:50:03 +0000 (17:50 +0000)
(or follow up) extern declaration with weak_import as
an actual definition. make clang follows this behavior.
// rdar://9538608
llvm-gcc treats an extern declaration with weak_import

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133450 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
lib/Sema/SemaDecl.cpp
test/CodeGen/attr-weak-import.c [new file with mode: 0644]

index 57b4f7f2ae4b2270d74602be3b64ac96784808e5..7f4546f07965d8fb55300f8d79b7567e3a5cd407 100644 (file)
@@ -1351,7 +1351,8 @@ CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D,
            ((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) ||
              D->getAttr<CommonAttr>()) &&
            !D->hasExternalStorage() && !D->getInit() &&
-           !D->getAttr<SectionAttr>() && !D->isThreadSpecified()) {
+           !D->getAttr<SectionAttr>() && !D->isThreadSpecified() &&
+           !D->getAttr<WeakImportAttr>()) {
     // Thread local vars aren't considered common linkage.
     return llvm::GlobalVariable::CommonLinkage;
   }
index 897b01d09319ae22ab2a546e973d44489322b3e0..fe3b3b4f7c17f282d4886e62572fa879c422faac 100644 (file)
@@ -2039,6 +2039,12 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
   }
   
   mergeDeclAttributes(New, Old, Context);
+  // weak_import on current declaration is applied to previous
+  // tentative definiton.
+  if (New->getAttr<WeakImportAttr>() &&
+      Old->getStorageClass() == SC_None &&
+      !Old->getAttr<WeakImportAttr>())
+    Old->addAttr(::new (Context) WeakImportAttr(SourceLocation(), Context));
 
   // Merge the types.
   MergeVarDeclTypes(New, Old);
diff --git a/test/CodeGen/attr-weak-import.c b/test/CodeGen/attr-weak-import.c
new file mode 100644 (file)
index 0000000..f02d09e
--- /dev/null
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -triple x86_64-darwin-apple -emit-llvm -o - %s | FileCheck %s
+// rdar://9538608
+
+extern int A __attribute__((weak_import));
+int A;
+
+extern int B __attribute__((weak_import));
+extern int B;
+
+int C;
+extern int C __attribute__((weak_import));
+
+extern int D __attribute__((weak_import));
+extern int D __attribute__((weak_import));
+int D;
+
+extern int E __attribute__((weak_import));
+int E;
+extern int E __attribute__((weak_import));
+
+// CHECK: @A = global i32
+// CHECK-NOT: @B =
+// CHECK: @C = global i32
+// CHECK: @D = global i32
+// CHECK: @E = global i32
+