From ab578bf355029bc61cd37bfd99e1d72028db672f Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 20 Jun 2011 17:50:03 +0000 Subject: [PATCH] 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 llvm-svn: 133450 --- clang/lib/CodeGen/CodeGenModule.cpp | 3 ++- clang/lib/Sema/SemaDecl.cpp | 6 ++++++ clang/test/CodeGen/attr-weak-import.c | 26 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGen/attr-weak-import.c diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 57b4f7f2ae4b..7f4546f07965 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/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/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 897b01d09319..fe3b3b4f7c17 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/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/clang/test/CodeGen/attr-weak-import.c b/clang/test/CodeGen/attr-weak-import.c new file mode 100644 index 000000000000..f02d09e81509 --- /dev/null +++ b/clang/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 +