Allow aliases to be unnamed.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 17 Jun 2015 17:53:31 +0000 (17:53 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 17 Jun 2015 17:53:31 +0000 (17:53 +0000)
If globals can be unnamed, there is no reason for aliases to be different.

The restriction was there since the original implementation in r36435. I
can only guess it was there because of the old bison parser for the old
alias syntax.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239921 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AsmParser/LLParser.cpp
lib/IR/AsmWriter.cpp
lib/IR/Verifier.cpp
test/Assembler/unnamed-alias.ll [new file with mode: 0644]

index 0b6740dba3beda541c0a061a78f1efdd9279362f..064b74304a9fdf624d29b4787b39e02883ddf293 100644 (file)
@@ -670,6 +670,9 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc, unsigned L,
   GA->setDLLStorageClass((GlobalValue::DLLStorageClassTypes)DLLStorageClass);
   GA->setUnnamedAddr(UnnamedAddr);
 
+  if (Name.empty())
+    NumberedVals.push_back(GA.get());
+
   // See if this value already exists in the symbol table.  If so, it is either
   // a redefinition or a definition of a forward reference.
   if (GlobalValue *Val = M->getNamedValue(Name)) {
index 611acc68845b1f50dc1fbe44daa63009d4d0cc30..05f7e08555fb00650bed16a337ccee4a7894c4a0 100644 (file)
@@ -730,6 +730,11 @@ void SlotTracker::processModule() {
       CreateModuleSlot(&Var);
   }
 
+  for (const GlobalAlias &A : TheModule->aliases()) {
+    if (!A.hasName())
+      CreateModuleSlot(&A);
+  }
+
   // Add metadata used by named metadata.
   for (const NamedMDNode &NMD : TheModule->named_metadata()) {
     for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i)
@@ -2356,13 +2361,9 @@ void AssemblyWriter::printAlias(const GlobalAlias *GA) {
   if (GA->isMaterializable())
     Out << "; Materializable\n";
 
-  // Don't crash when dumping partially built GA
-  if (!GA->hasName())
-    Out << "<<nameless>> = ";
-  else {
-    PrintLLVMName(Out, GA);
-    Out << " = ";
-  }
+  WriteAsOperandInternal(Out, GA, &TypePrinter, &Machine, GA->getParent());
+  Out << " = ";
+
   PrintLinkage(GA->getLinkage(), Out);
   PrintVisibility(GA->getVisibility(), Out);
   PrintDLLStorageClass(GA->getDLLStorageClass(), Out);
index 5fac05527bbfb5542d5cee41cc268575f4544123..13b451a06b20b8f4fc4b0ca3e33a6045ba515992 100644 (file)
@@ -584,7 +584,6 @@ void Verifier::visitAliaseeSubExpr(SmallPtrSetImpl<const GlobalAlias*> &Visited,
 }
 
 void Verifier::visitGlobalAlias(const GlobalAlias &GA) {
-  Assert(!GA.getName().empty(), "Alias name cannot be empty!", &GA);
   Assert(GlobalAlias::isValidLinkage(GA.getLinkage()),
          "Alias should have private, internal, linkonce, weak, linkonce_odr, "
          "weak_odr, or external linkage!",
diff --git a/test/Assembler/unnamed-alias.ll b/test/Assembler/unnamed-alias.ll
new file mode 100644 (file)
index 0000000..8ae1c45
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: llvm-as < %s | llvm-dis | FileCheck %s
+
+@0 = private constant i32 0
+; CHECK: @0 = private constant i32 0
+@1 = private constant i32 1
+; CHECK: @1 = private constant i32 1
+
+@2 = private alias i32* @0
+; CHECK: @2 = private alias i32* @0
+@3 = private alias i32* @1
+; CHECK: @3 = private alias i32* @1