forked from OSchip/llvm-project
Add support for aliases with linkonce_odr.
This will be used to extend constructor aliases in clang. llvm-svn: 192066
This commit is contained in:
parent
93c69ac8c3
commit
78527050c2
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue