diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 39 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 1 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 7 | ||||
-rw-r--r-- | clang/test/Sema/attr-alias-elf.c | 22 |
6 files changed, 3 insertions, 71 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 08240d1568c..415c4b29633 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2015,8 +2015,6 @@ def err_attribute_weakref_without_alias : Error< "weakref declaration of '%0' must also have an alias attribute">; def err_alias_not_supported_on_darwin : Error < "only weak aliases are supported on darwin">; -def err_alias_to_undefined : Error< - "alias must point to a defined variable or function">; def warn_attribute_wrong_decl_type : Warning< "%0 attribute only applies to %select{functions|unions|" "variables and functions|functions and methods|parameters|" diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 2311e084b72..567444253c9 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -929,8 +929,9 @@ static RValue EmitNewDeleteCall(CodeGenFunction &CGF, /// to a replaceable global allocation function. /// /// We model such elidable calls with the 'builtin' attribute. + llvm::Function *Fn = dyn_cast<llvm::Function>(CalleeAddr); if (Callee->isReplaceableGlobalAllocationFunction() && - !Callee->hasAttr<AliasAttr>()) { + Fn && Fn->hasFnAttribute(llvm::Attribute::NoBuiltin)) { // FIXME: Add addAttribute to CallSite. if (llvm::CallInst *CI = dyn_cast<llvm::CallInst>(CallOrInvoke)) CI->addAttribute(llvm::AttributeSet::FunctionIndex, diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 2939b4a3d2c..96ae437ff46 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -37,7 +37,6 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Basic/Version.h" #include "clang/Frontend/CodeGenOptions.h" -#include "clang/Sema/SemaDiagnostic.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/Triple.h" #include "llvm/IR/CallingConv.h" @@ -934,12 +933,6 @@ void CodeGenModule::EmitDeferred() { GlobalDecl D = DeferredDeclsToEmit.back(); DeferredDeclsToEmit.pop_back(); - const ValueDecl *Global = cast<ValueDecl>(D.getDecl()); - if (Global->hasAttr<AliasAttr>()) { - EmitAliasDefinition(D); - continue; - } - // Check to see if we've already emitted this. This is necessary // for a couple of reasons: first, decls can end up in the // deferred-decls queue multiple times, and second, decls can end @@ -1105,7 +1098,7 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) { // If this is an alias definition (which otherwise looks like a declaration) // emit it now. if (Global->hasAttr<AliasAttr>()) - return scheduleAliasDefinitionEmission(GD); + return EmitAliasDefinition(GD); // If this is CUDA, be selective about which declarations we emit. if (LangOpts.CUDA) { @@ -2082,24 +2075,6 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) { AddGlobalAnnotations(D, Fn); } -void CodeGenModule::scheduleAliasDefinitionEmission(GlobalDecl GD) { - const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); - const AliasAttr *AA = D->getAttr<AliasAttr>(); - assert(AA && "Not an alias?"); - - // Schedule it. - DeferredDeclsToEmit.push_back(GD); - - llvm::Type *DeclTy = getTypes().ConvertTypeForMem(D->getType()); - - // Cause the aliasee emission to be scheduled. - if (isa<llvm::FunctionType>(DeclTy)) - GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GD, /*ForVTable=*/false); - else - GetOrCreateLLVMGlobal(AA->getAliasee(), - llvm::PointerType::getUnqual(DeclTy), 0); -} - void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { const ValueDecl *D = cast<ValueDecl>(GD.getDecl()); const AliasAttr *AA = D->getAttr<AliasAttr>(); @@ -2125,18 +2100,6 @@ void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(), llvm::PointerType::getUnqual(DeclTy), 0); - llvm::GlobalValue *GV = dyn_cast<llvm::GlobalValue>(Aliasee); - if (!GV) { - llvm::ConstantExpr *CE = cast<llvm::ConstantExpr>(Aliasee); - assert(CE->getOpcode() == llvm::Instruction::BitCast || - CE->getOpcode() == llvm::Instruction::GetElementPtr); - GV = cast<llvm::GlobalValue>(CE->getOperand(0)); - } - if (GV->isDeclaration()) { - getDiags().Report(AA->getLocation(), diag::err_alias_to_undefined); - return; - } - // Create the new alias itself, but don't set a name yet. llvm::GlobalValue *GA = new llvm::GlobalAlias(Aliasee->getType(), diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index d2dc8358eaf..066009ca7df 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1024,7 +1024,6 @@ private: void EmitGlobalFunctionDefinition(GlobalDecl GD); void EmitGlobalVarDefinition(const VarDecl *D); - void scheduleAliasDefinitionEmission(GlobalDecl GD); void EmitAliasDefinition(GlobalDecl GD); void EmitObjCPropertyImplementations(const ObjCImplementationDecl *D); void EmitObjCIvarInitializations(ObjCImplementationDecl *D); diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index a08abd9efcf..a71d3c0d7b5 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -5020,13 +5020,6 @@ void Sema::DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W) { W.setUsed(true); if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...)) IdentifierInfo *NDId = ND->getIdentifier(); - - // FIXME: we should reject this (pr17640). - NamedDecl *Aliasee = LookupSingleName(TUScope, W.getAlias(), - W.getLocation(), LookupOrdinaryName); - if (Aliasee && Aliasee->hasAttr<AliasAttr>()) - return; - NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias(), W.getLocation()); NewD->addAttr(::new (Context) AliasAttr(W.getLocation(), Context, NDId->getName())); diff --git a/clang/test/Sema/attr-alias-elf.c b/clang/test/Sema/attr-alias-elf.c deleted file mode 100644 index 32e41027c80..00000000000 --- a/clang/test/Sema/attr-alias-elf.c +++ /dev/null @@ -1,22 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-pc-linux -fsyntax-only -verify -emit-llvm-only %s - -void f1(void) __attribute__((alias("g1"))); -void g1(void) { -} - -void f2(void) __attribute__((alias("g2"))); // expected-error {{alias must point to a defined variable or function}} - - -void f3(void) __attribute__((alias("g3"))); // expected-error {{alias must point to a defined variable or function}} -void g3(void); - -extern int a1 __attribute__((alias("b1"))); -int b1 = 42; - -extern int a2 __attribute__((alias("b2"))); // expected-error {{alias must point to a defined variable or function}} - -extern int a3 __attribute__((alias("b3"))); // expected-error {{alias must point to a defined variable or function}} -extern int b3; - -extern int a4 __attribute__((alias("b4"))); // expected-error {{alias must point to a defined variable or function}} -typedef int b4; |