- Change "ExternalSymbolSDNode" to "SymbolSDNode".
- Add linkage to SymbolSDNode (default to external).
- Change ISD::ExternalSymbol to ISD::Symbol.
- Change ISD::TargetExternalSymbol to ISD::TargetSymbol

These changes pave the way to allowing SymbolSDNodes with non-external linkage.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56249 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index ba78b81..741e3f7 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -799,7 +799,7 @@
   case ISD::TargetConstantPool:
   case ISD::TargetGlobalAddress:
   case ISD::TargetGlobalTLSAddress:
-  case ISD::TargetExternalSymbol:
+  case ISD::TargetSymbol:
   case ISD::VALUETYPE:
   case ISD::SRCVALUE:
   case ISD::MEMOPERAND:
@@ -832,7 +832,7 @@
   case ISD::GLOBAL_OFFSET_TABLE:
   case ISD::GlobalAddress:
   case ISD::GlobalTLSAddress:
-  case ISD::ExternalSymbol:
+  case ISD::Symbol:
   case ISD::ConstantPool:
   case ISD::JumpTable: // Nothing to do.
     switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
@@ -3979,7 +3979,7 @@
       std::pair<SDValue,SDValue> CallResult =
         TLI.LowerCallTo(Tmp1, Type::VoidTy,
                         false, false, false, CallingConv::C, false,
-                        DAG.getExternalSymbol("abort", TLI.getPointerTy()),
+                        DAG.getSymbol("abort", TLI.getPointerTy()),
                         Args, DAG);
       Result = CallResult.second;
       break;
@@ -5293,8 +5293,9 @@
     Entry.isZExt = !isSigned;
     Args.push_back(Entry);
   }
-  SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
-                                           TLI.getPointerTy());
+
+  SDValue Callee = DAG.getSymbol(TLI.getLibcallName(LC),
+                                 TLI.getPointerTy());
 
   // Splice the libcall in wherever FindInputOutputChains tells us to.
   const Type *RetTy = Node->getValueType(0).getTypeForMVT();
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
index 640392f..9a05501 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp
@@ -623,8 +623,8 @@
     Entry.isZExt = !isSigned;
     Args.push_back(Entry);
   }
-  SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
-                                           TLI.getPointerTy());
+
+  SDValue Callee = DAG.getSymbol(TLI.getLibcallName(LC), TLI.getPointerTy());
 
   const Type *RetTy = RetVT.getTypeForMVT();
   std::pair<SDValue,SDValue> CallInfo =
diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGEmit.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGEmit.cpp
index 156905a..52428cb 100644
--- a/lib/CodeGen/SelectionDAG/ScheduleDAGEmit.cpp
+++ b/lib/CodeGen/SelectionDAG/ScheduleDAGEmit.cpp
@@ -288,7 +288,7 @@
     else
       Idx = ConstPool->getConstantPoolIndex(CP->getConstVal(), Align);
     MI->addOperand(MachineOperand::CreateCPI(Idx, Offset));
-  } else if (ExternalSymbolSDNode *ES = dyn_cast<ExternalSymbolSDNode>(Op)) {
+  } else if (SymbolSDNode *ES = dyn_cast<SymbolSDNode>(Op)) {
     MI->addOperand(MachineOperand::CreateES(ES->getSymbol()));
   } else {
     assert(Op.getValueType() != MVT::Other &&
@@ -571,8 +571,7 @@
     MachineInstr *MI = BuildMI(*MF, TII->get(TargetInstrInfo::INLINEASM));
 
     // Add the asm string as an external symbol operand.
-    const char *AsmStr =
-      cast<ExternalSymbolSDNode>(Node->getOperand(1))->getSymbol();
+    const char *AsmStr = cast<SymbolSDNode>(Node->getOperand(1))->getSymbol();
     MI->addOperand(MachineOperand::CreateES(AsmStr));
       
     // Add all of the operand registers to the instruction.
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 793f5c9..9e42307 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -614,12 +614,11 @@
     Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != 0;
     CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = 0;
     break;
-  case ISD::ExternalSymbol:
-    Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
+  case ISD::Symbol:
+    Erased = Symbols.erase(cast<SymbolSDNode>(N)->getSymbol());
     break;
-  case ISD::TargetExternalSymbol:
-    Erased =
-      TargetExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
+  case ISD::TargetSymbol:
+    Erased = TargetSymbols.erase(cast<SymbolSDNode>(N)->getSymbol());
     break;
   case ISD::VALUETYPE: {
     MVT VT = cast<VTSDNode>(N)->getVT();
@@ -842,8 +841,8 @@
   CSEMap.clear();
 
   ExtendedValueTypeNodes.clear();
-  ExternalSymbols.clear();
-  TargetExternalSymbols.clear();
+  Symbols.clear();
+  TargetSymbols.clear();
   std::fill(CondCodeNodes.begin(), CondCodeNodes.end(),
             static_cast<CondCodeSDNode*>(0));
   std::fill(ValueTypeNodes.begin(), ValueTypeNodes.end(),
@@ -1098,20 +1097,22 @@
   return SDValue(N, 0);
 }
 
-SDValue SelectionDAG::getExternalSymbol(const char *Sym, MVT VT) {
-  SDNode *&N = ExternalSymbols[Sym];
+SDValue SelectionDAG::getSymbol(const char *Sym, MVT VT,
+                                GlobalValue::LinkageTypes LT) {
+  SDNode *&N = Symbols[Sym];
   if (N) return SDValue(N, 0);
-  N = NodeAllocator.Allocate<ExternalSymbolSDNode>();
-  new (N) ExternalSymbolSDNode(false, Sym, VT);
+  N = NodeAllocator.Allocate<SymbolSDNode>();
+  new (N) SymbolSDNode(false, Sym, VT, LT);
   AllNodes.push_back(N);
   return SDValue(N, 0);
 }
 
-SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, MVT VT) {
-  SDNode *&N = TargetExternalSymbols[Sym];
+SDValue SelectionDAG::getTargetSymbol(const char *Sym, MVT VT,
+                                      GlobalValue::LinkageTypes LT) {
+  SDNode *&N = TargetSymbols[Sym];
   if (N) return SDValue(N, 0);
-  N = NodeAllocator.Allocate<ExternalSymbolSDNode>();
-  new (N) ExternalSymbolSDNode(true, Sym, VT);
+  N = NodeAllocator.Allocate<SymbolSDNode>();
+  new (N) SymbolSDNode(true, Sym, VT, LT);
   AllNodes.push_back(N);
   return SDValue(N, 0);
 }
@@ -3098,7 +3099,7 @@
   std::pair<SDValue,SDValue> CallResult =
     TLI.LowerCallTo(Chain, Type::VoidTy,
                     false, false, false, CallingConv::C, false,
-                    getExternalSymbol("memcpy", TLI.getPointerTy()),
+                    getSymbol("memcpy", TLI.getPointerTy()),
                     Args, *this);
   return CallResult.second;
 }
@@ -3143,7 +3144,7 @@
   std::pair<SDValue,SDValue> CallResult =
     TLI.LowerCallTo(Chain, Type::VoidTy,
                     false, false, false, CallingConv::C, false,
-                    getExternalSymbol("memmove", TLI.getPointerTy()),
+                    getSymbol("memmove", TLI.getPointerTy()),
                     Args, *this);
   return CallResult.second;
 }
@@ -3194,7 +3195,7 @@
   std::pair<SDValue,SDValue> CallResult =
     TLI.LowerCallTo(Chain, Type::VoidTy,
                     false, false, false, CallingConv::C, false,
-                    getExternalSymbol("memset", TLI.getPointerTy()),
+                    getSymbol("memset", TLI.getPointerTy()),
                     Args, *this);
   return CallResult.second;
 }
@@ -4610,7 +4611,7 @@
 void RegisterSDNode::ANCHOR() {}
 void DbgStopPointSDNode::ANCHOR() {}
 void LabelSDNode::ANCHOR() {}
-void ExternalSymbolSDNode::ANCHOR() {}
+void SymbolSDNode::ANCHOR() {}
 void CondCodeSDNode::ANCHOR() {}
 void ARG_FLAGSSDNode::ANCHOR() {}
 void VTSDNode::ANCHOR() {}
@@ -4914,14 +4915,14 @@
   case ISD::FrameIndex:    return "FrameIndex";
   case ISD::JumpTable:     return "JumpTable";
   case ISD::GLOBAL_OFFSET_TABLE: return "GLOBAL_OFFSET_TABLE";
-  case ISD::RETURNADDR: return "RETURNADDR";
-  case ISD::FRAMEADDR: return "FRAMEADDR";
+  case ISD::RETURNADDR:    return "RETURNADDR";
+  case ISD::FRAMEADDR:     return "FRAMEADDR";
   case ISD::FRAME_TO_ARGS_OFFSET: return "FRAME_TO_ARGS_OFFSET";
   case ISD::EXCEPTIONADDR: return "EXCEPTIONADDR";
-  case ISD::EHSELECTION: return "EHSELECTION";
-  case ISD::EH_RETURN: return "EH_RETURN";
+  case ISD::EHSELECTION:   return "EHSELECTION";
+  case ISD::EH_RETURN:     return "EH_RETURN";
   case ISD::ConstantPool:  return "ConstantPool";
-  case ISD::ExternalSymbol: return "ExternalSymbol";
+  case ISD::Symbol:        return "Symbol";
   case ISD::INTRINSIC_WO_CHAIN: {
     unsigned IID = cast<ConstantSDNode>(getOperand(0))->getZExtValue();
     return Intrinsic::getName((Intrinsic::ID)IID);
@@ -4940,7 +4941,7 @@
   case ISD::TargetFrameIndex: return "TargetFrameIndex";
   case ISD::TargetJumpTable:  return "TargetJumpTable";
   case ISD::TargetConstantPool:  return "TargetConstantPool";
-  case ISD::TargetExternalSymbol: return "TargetExternalSymbol";
+  case ISD::TargetSymbol:  return "TargetSymbol";
 
   case ISD::CopyToReg:     return "CopyToReg";
   case ISD::CopyFromReg:   return "CopyFromReg";
@@ -5230,9 +5231,23 @@
     } else {
       OS << " #" << R->getReg();
     }
-  } else if (const ExternalSymbolSDNode *ES =
-             dyn_cast<ExternalSymbolSDNode>(this)) {
-    OS << "'" << ES->getSymbol() << "'";
+  } else if (const SymbolSDNode *S =
+             dyn_cast<SymbolSDNode>(this)) {
+    OS << "'" << S->getSymbol() << "' ";
+
+    switch (S->getLinkage()) {
+    default: assert(0 && "Invalid linkage type!"); break;
+    case GlobalValue::ExternalLinkage:       OS << "[external]"; break;
+    case GlobalValue::LinkOnceLinkage:       OS << "[once]"; break;
+    case GlobalValue::WeakLinkage:           OS << "[weak]"; break;
+    case GlobalValue::AppendingLinkage:      OS << "[appending]"; break;
+    case GlobalValue::InternalLinkage:       OS << "[internal]"; break;
+    case GlobalValue::DLLImportLinkage:      OS << "[dllimport]"; break;
+    case GlobalValue::DLLExportLinkage:      OS << "[dllexport]"; break;
+    case GlobalValue::ExternalWeakLinkage:   OS << "[externweak]"; break;
+    case GlobalValue::GhostLinkage:          OS << "[ghost]"; break;
+    case GlobalValue::CommonLinkage:         OS << "[common]"; break;
+    }
   } else if (const SrcValueSDNode *M = dyn_cast<SrcValueSDNode>(this)) {
     if (M->getValue())
       OS << "<" << M->getValue() << ">";
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
index 62a6b4f..f82fd34 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
@@ -4293,7 +4293,7 @@
   if (!RenameFn)
     Callee = getValue(I.getOperand(0));
   else
-    Callee = DAG.getExternalSymbol(RenameFn, TLI.getPointerTy());
+    Callee = DAG.getSymbol(RenameFn, TLI.getPointerTy());
 
   LowerCallTo(&I, Callee, I.isTailCall());
 }
@@ -4888,7 +4888,7 @@
   std::vector<SDValue> AsmNodeOperands;
   AsmNodeOperands.push_back(SDValue());  // reserve space for input chain
   AsmNodeOperands.push_back(
-          DAG.getTargetExternalSymbol(IA->getAsmString().c_str(), MVT::Other));
+          DAG.getTargetSymbol(IA->getAsmString().c_str(), MVT::Other));
   
   
   // Loop over all of the inputs, copying the operand values into the
@@ -5139,7 +5139,7 @@
 
   std::pair<SDValue,SDValue> Result =
     TLI.LowerCallTo(getRoot(), I.getType(), false, false, false, CallingConv::C,
-                    PerformTailCallOpt, DAG.getExternalSymbol("malloc", IntPtr),
+                    PerformTailCallOpt, DAG.getSymbol("malloc", IntPtr),
                     Args, DAG);
   setValue(&I, Result.first);  // Pointers always fit in registers
   DAG.setRoot(Result.second);
@@ -5155,7 +5155,7 @@
   std::pair<SDValue,SDValue> Result =
     TLI.LowerCallTo(getRoot(), Type::VoidTy, false, false, false,
                     CallingConv::C, PerformTailCallOpt,
-                    DAG.getExternalSymbol("free", IntPtr), Args, DAG);
+                    DAG.getSymbol("free", IntPtr), Args, DAG);
   DAG.setRoot(Result.second);
 }
 
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
index 570caa9..aca115f 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
@@ -185,9 +185,8 @@
       Op += ", isVarArg";
     if (C->isTailCall())
       Op += ", isTailCall";
-  } else if (const ExternalSymbolSDNode *ES =
-             dyn_cast<ExternalSymbolSDNode>(Node)) {
-    Op += "'" + std::string(ES->getSymbol()) + "'";
+  } else if (const SymbolSDNode *S = dyn_cast<SymbolSDNode>(Node)) {
+    Op += "'" + std::string(S->getSymbol()) + "'";
   } else if (const SrcValueSDNode *M = dyn_cast<SrcValueSDNode>(Node)) {
     if (M->getValue())
       Op += "<" + M->getValue()->getName() + ">";