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
This commit is contained in:
Fariborz Jahanian 2011-06-20 17:50:03 +00:00
Родитель 6fe6bac2ad
Коммит ab27d6ea7b
3 изменённых файлов: 34 добавлений и 1 удалений

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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);

Просмотреть файл

@ -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