Add support for aliases with linkonce_odr.
authorRafael Espindola <rafael.espindola@gmail.com>
Sun, 6 Oct 2013 15:10:43 +0000 (15:10 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sun, 6 Oct 2013 15:10:43 +0000 (15:10 +0000)
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

docs/LangRef.rst
lib/AsmParser/LLParser.cpp
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/IR/Verifier.cpp
test/CodeGen/X86/aliases.ll

index 4165a5bbcd2241c5eb72debe293ef97993a85728..6a78c140f3c365bd5c3ddef6f20f6a0cd537db83 100644 (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
index bdc79068946a69996f8665027f7567029a026444..d5c5db11de8cae009ac2ad9f59ccc198b318aa69 100644 (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;
index dae305b0b4c2b67a4a8c8523a7d27566ff20d071..4b5edec4c6f9aba0096de90934829a603c431853 100644 (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");
index b6d148b377c869b775b6fa555269a79b2be501ee..c01083923542126690c4bf92ea87d8862cfbce0f 100644 (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);
index 4658cb42cdd47387800bb84c17c763dc5d3e77ef..025dcfedb62183f00e0c6ac33d84614c5799023a 100644 (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