aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-10-06 15:10:43 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-10-06 15:10:43 +0000
commit2def17935c87f5e6b23d899567ef3dd00ed89d48 (patch)
tree78000a447829d54c2c4dfdae66314a83c8d2700a
parentfb7cb838b9f99317e80815f74d1baba530086569 (diff)
downloadexternal_llvm-2def17935c87f5e6b23d899567ef3dd00ed89d48.tar.gz
external_llvm-2def17935c87f5e6b23d899567ef3dd00ed89d48.tar.bz2
external_llvm-2def17935c87f5e6b23d899567ef3dd00ed89d48.zip
Add support for aliases with linkonce_odr.
This will be used to extend constructor aliases in clang. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192066 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--docs/LangRef.rst6
-rw-r--r--lib/AsmParser/LLParser.cpp17
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp2
-rw-r--r--lib/IR/Verifier.cpp2
-rw-r--r--test/CodeGen/X86/aliases.ll3
5 files changed, 19 insertions, 11 deletions
diff --git a/docs/LangRef.rst b/docs/LangRef.rst
index 4165a5bbcd..6a78c140f3 100644
--- a/docs/LangRef.rst
+++ b/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/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp
index bdc7906894..d5c5db11de 100644
--- a/lib/AsmParser/LLParser.cpp
+++ b/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/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index dae305b0b4..4b5edec4c6 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/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/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp
index b6d148b377..c010839235 100644
--- a/lib/IR/Verifier.cpp
+++ b/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/test/CodeGen/X86/aliases.ll b/test/CodeGen/X86/aliases.ll
index 4658cb42cd..025dcfedb6 100644
--- a/test/CodeGen/X86/aliases.ll
+++ b/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