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
This commit is contained in:
Rafael Espindola 2013-10-06 15:10:43 +00:00
parent fb7cb838b9
commit 2def17935c
5 changed files with 19 additions and 11 deletions

View File

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

View File

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

View File

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

View File

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

View File

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