diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-06 15:10:43 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-10-06 15:10:43 +0000 |
commit | 78527050c28fcdb57c0d24a10b55ab43dc4e5412 (patch) | |
tree | e288583d75b747e3820f1c5ddf4e4d53e2a65ef1 | |
parent | 93c69ac8c342a353ef4b0b9709ecb129a9332095 (diff) | |
download | bcm5719-llvm-78527050c28fcdb57c0d24a10b55ab43dc4e5412.tar.gz bcm5719-llvm-78527050c28fcdb57c0d24a10b55ab43dc4e5412.zip |
Add support for aliases with linkonce_odr.
This will be used to extend constructor aliases in clang.
llvm-svn: 192066
-rw-r--r-- | llvm/docs/LangRef.rst | 6 | ||||
-rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 17 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/aliases.ll | 3 |
5 files changed, 19 insertions, 11 deletions
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 4165a5bbcd2..6a78c140f3c 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -614,6 +614,12 @@ Syntax:: @<Name> = alias [Linkage] [Visibility] <AliaseeTy> @<Aliasee> +The linkgage must be one of ``private``, ``linker_private``, +``linker_private_weak``, ``internal``, ``linkonce``, ``weak``, +``linkonce_odr``, ``weak_odr``, ``linkonce_odr_auto_hide``, ``external``. Note +that some system linkers might not correctly handle dropping a weak symbol that +is aliased by a non weak alias. + .. _namedmetadatastructure: Named Metadata diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index bdc79068946..d5c5db11de8 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -627,18 +627,17 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc, unsigned Visibility) { assert(Lex.getKind() == lltok::kw_alias); Lex.Lex(); - unsigned Linkage; LocTy LinkageLoc = Lex.getLoc(); - if (ParseOptionalLinkage(Linkage)) + unsigned L; + if (ParseOptionalLinkage(L)) return true; - if (Linkage != GlobalValue::ExternalLinkage && - Linkage != GlobalValue::WeakAnyLinkage && - Linkage != GlobalValue::WeakODRLinkage && - Linkage != GlobalValue::InternalLinkage && - Linkage != GlobalValue::PrivateLinkage && - Linkage != GlobalValue::LinkerPrivateLinkage && - Linkage != GlobalValue::LinkerPrivateWeakLinkage) + GlobalValue::LinkageTypes Linkage = (GlobalValue::LinkageTypes) L; + + if(!GlobalValue::isExternalLinkage(Linkage) && + !GlobalValue::isLocalLinkage(Linkage) && + !GlobalValue::isWeakLinkage(Linkage) && + !GlobalValue::isLinkOnceLinkage(Linkage)) return Error(LinkageLoc, "invalid linkage type for alias"); Constant *Aliasee; diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index dae305b0b4c..4b5edec4c6f 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -934,7 +934,7 @@ bool AsmPrinter::doFinalization(Module &M) { if (I->hasExternalLinkage() || !MAI->getWeakRefDirective()) OutStreamer.EmitSymbolAttribute(Name, MCSA_Global); - else if (I->hasWeakLinkage()) + else if (I->hasWeakLinkage() || I->hasLinkOnceLinkage()) OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference); else assert(I->hasLocalLinkage() && "Invalid alias linkage"); diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index b6d148b377c..c0108392354 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -530,7 +530,7 @@ void Verifier::visitGlobalAlias(GlobalAlias &GA) { Assert1(!GA.getName().empty(), "Alias name cannot be empty!", &GA); Assert1(GA.hasExternalLinkage() || GA.hasLocalLinkage() || - GA.hasWeakLinkage(), + GA.hasWeakLinkage() || GA.hasLinkOnceLinkage(), "Alias should have external or external weak linkage!", &GA); Assert1(GA.getAliasee(), "Aliasee cannot be NULL!", &GA); diff --git a/llvm/test/CodeGen/X86/aliases.ll b/llvm/test/CodeGen/X86/aliases.ll index 4658cb42cdd..025dcfedb62 100644 --- a/llvm/test/CodeGen/X86/aliases.ll +++ b/llvm/test/CodeGen/X86/aliases.ll @@ -14,6 +14,9 @@ declare i32 @foo_f() ; CHECK-DAG: .weak bar_f @bar_f = alias weak %FunTy* @foo_f +@bar_l = alias linkonce_odr i32* @bar +; CHECK-DAG: .weak bar_l + @bar_i = alias internal i32* @bar ; CHECK-DAG: .globl A |