diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/AttributeList.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 12 |
3 files changed, 17 insertions, 1 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index a3cf69b675..1dab027455 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1214,7 +1214,9 @@ CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D, // FIXME: It seems like we can provide more specific linkage here // (LinkOnceODR, WeakODR). return llvm::GlobalVariable::WeakAnyLinkage; - else if (!getLangOptions().CPlusPlus && !CodeGenOpts.NoCommon && + else if (!getLangOptions().CPlusPlus && + ((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) || + D->getAttr<CommonAttr>()) && !D->hasExternalStorage() && !D->getInit() && !D->getAttr<SectionAttr>() && !D->isThreadSpecified()) { // Thread local vars aren't considered common linkage. diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp index 409e2488bd..b2ceb53cc5 100644 --- a/lib/Sema/AttributeList.cpp +++ b/lib/Sema/AttributeList.cpp @@ -130,5 +130,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { .Case("global", AT_global) .Case("host", AT_host) .Case("shared", AT_shared) + .Case("common", AT_common) + .Case("nocommon", AT_nocommon) .Default(UnknownAttribute); } diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index df74e00de0..ee03d1f7f1 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -743,6 +743,16 @@ static void HandleMayAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) { d->addAttr(::new (S.Context) MayAliasAttr(Attr.getLoc(), S.Context)); } +static void HandleNoCommonAttr(Decl *d, const AttributeList &Attr, Sema &S) { + assert(Attr.isInvalid() == false); + d->addAttr(::new (S.Context) NoCommonAttr(Attr.getLoc(), S.Context)); +} + +static void HandleCommonAttr(Decl *d, const AttributeList &Attr, Sema &S) { + assert(Attr.isInvalid() == false); + d->addAttr(::new (S.Context) CommonAttr(Attr.getLoc(), S.Context)); +} + static void HandleNoReturnAttr(Decl *d, const AttributeList &Attr, Sema &S) { /* Diagnostics (if any) was emitted by Sema::ProcessFnAttr(). */ assert(Attr.isInvalid() == false); @@ -2474,6 +2484,7 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D, case AttributeList::AT_base_check: HandleBaseCheckAttr (D, Attr, S); break; case AttributeList::AT_carries_dependency: HandleDependencyAttr (D, Attr, S); break; + case AttributeList::AT_common: HandleCommonAttr (D, Attr, S); break; case AttributeList::AT_constant: HandleConstantAttr (D, Attr, S); break; case AttributeList::AT_constructor: HandleConstructorAttr (D, Attr, S); break; case AttributeList::AT_deprecated: HandleDeprecatedAttr (D, Attr, S); break; @@ -2492,6 +2503,7 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D, case AttributeList::AT_mode: HandleModeAttr (D, Attr, S); break; case AttributeList::AT_malloc: HandleMallocAttr (D, Attr, S); break; case AttributeList::AT_may_alias: HandleMayAliasAttr (D, Attr, S); break; + case AttributeList::AT_nocommon: HandleNoCommonAttr (D, Attr, S); break; case AttributeList::AT_nonnull: HandleNonNullAttr (D, Attr, S); break; case AttributeList::AT_ownership_returns: case AttributeList::AT_ownership_takes: |