From: Fariborz Jahanian Date: Mon, 20 Jun 2011 17:50:03 +0000 (+0000) Subject: llvm-gcc treats a tentative definition with a previous X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ab27d6ea7b4ce2762a16905281de796db32bb6f2;p=clang llvm-gcc treats a tentative definition with a previous (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 --- diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 57b4f7f2ae..7f4546f079 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1351,7 +1351,8 @@ CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, ((!CodeGenOpts.NoCommon && !D->getAttr()) || D->getAttr()) && !D->hasExternalStorage() && !D->getInit() && - !D->getAttr() && !D->isThreadSpecified()) { + !D->getAttr() && !D->isThreadSpecified() && + !D->getAttr()) { // Thread local vars aren't considered common linkage. return llvm::GlobalVariable::CommonLinkage; } diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 897b01d093..fe3b3b4f7c 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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() && + Old->getStorageClass() == SC_None && + !Old->getAttr()) + 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 index 0000000000..f02d09e815 --- /dev/null +++ b/test/CodeGen/attr-weak-import.c @@ -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 +