Drop bunch of half-working stuff in the ext_weak linkage support.
[oota-llvm.git] / lib / VMCore / AsmWriter.cpp
index ddcb8d6c0abafe6680eb263aec84d1f3ac802a13..68cf438e29a55ab9c90ac5789e8ea860845023d0 100644 (file)
@@ -39,14 +39,6 @@ using namespace llvm;
 // Make virtual table appear in this compilation unit.
 AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
 
-char PrintModulePass::ID = 0;
-static RegisterPass<PrintModulePass>
-X("print-module", "Print module to stderr");
-char PrintFunctionPass::ID = 0;
-static RegisterPass<PrintFunctionPass>
-Y("print-function","Print function to stderr");
-
-
 //===----------------------------------------------------------------------===//
 // Helper Functions
 //===----------------------------------------------------------------------===//
@@ -68,6 +60,25 @@ static const Module *getModuleFromVal(const Value *V) {
   return 0;
 }
 
+// PrintEscapedString - Print each character of the specified string, escaping
+// it if it is not printable or if it is an escape char.
+static void PrintEscapedString(const char *Str, unsigned Length,
+                               raw_ostream &Out) {
+  for (unsigned i = 0; i != Length; ++i) {
+    unsigned char C = Str[i];
+    if (isprint(C) && C != '\\' && C != '"' && isprint(C))
+      Out << C;
+    else
+      Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
+  }
+}
+
+// PrintEscapedString - Print each character of the specified string, escaping
+// it if it is not printable or if it is an escape char.
+static void PrintEscapedString(const std::string &Str, raw_ostream &Out) {
+  PrintEscapedString(Str.c_str(), Str.size(), Out);
+}
+
 enum PrefixType {
   GlobalPrefix,
   LabelPrefix,
@@ -90,7 +101,7 @@ static void PrintLLVMName(raw_ostream &OS, const char *NameStr,
   }      
   
   // Scan the name to see if it needs quotes first.
-  bool NeedsQuotes = NameStr[0] >= '0' && NameStr[0] <= '9';
+  bool NeedsQuotes = isdigit(NameStr[0]);
   if (!NeedsQuotes) {
     for (unsigned i = 0; i != NameLen; ++i) {
       char C = NameStr[i];
@@ -110,19 +121,7 @@ static void PrintLLVMName(raw_ostream &OS, const char *NameStr,
   // Okay, we need quotes.  Output the quotes and escape any scary characters as
   // needed.
   OS << '"';
-  for (unsigned i = 0; i != NameLen; ++i) {
-    char C = NameStr[i];
-    assert(C != '"' && "Illegal character in LLVM value name!");
-    if (C == '\\') {
-      OS << "\\\\";
-    } else if (isprint(C)) {
-      OS << C;
-    } else {
-      OS << '\\';
-      OS << hexdigit((C >> 4) & 0x0F);
-      OS << hexdigit((C >> 0) & 0x0F);
-    }
-  }
+  PrintEscapedString(NameStr, NameLen, OS);
   OS << '"';
 }
 
@@ -588,21 +587,6 @@ void llvm::WriteTypeSymbolic(raw_ostream &Out, const Type *Ty, const Module *M){
   }
 }
 
-// PrintEscapedString - Print each character of the specified string, escaping
-// it if it is not printable or if it is an escape char.
-static void PrintEscapedString(const std::string &Str, raw_ostream &Out) {
-  for (unsigned i = 0, e = Str.size(); i != e; ++i) {
-    unsigned char C = Str[i];
-    if (isprint(C) && C != '"' && C != '\\') {
-      Out << C;
-    } else {
-      Out << '\\'
-          << (char) ((C/16  < 10) ? ( C/16 +'0') : ( C/16 -10+'A'))
-          << (char)(((C&15) < 10) ? ((C&15)+'0') : ((C&15)-10+'A'));
-    }
-  }
-}
-
 static const char *getPredicateText(unsigned predicate) {
   const char * pred = "unknown";
   switch (predicate) {
@@ -656,6 +640,7 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
       // make sure that we only output it in exponential format if we can parse
       // the value back and get the same value.
       //
+      bool ignored;
       bool isDouble = &CFP->getValueAPF().getSemantics()==&APFloat::IEEEdouble;
       double Val = isDouble ? CFP->getValueAPF().convertToDouble() :
                               CFP->getValueAPF().convertToFloat();
@@ -675,10 +660,20 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
         }
       }
       // Otherwise we could not reparse it to exactly the same value, so we must
-      // output the string in hexadecimal format!
+      // output the string in hexadecimal format!  Note that loading and storing
+      // floating point types changes the bits of NaNs on some hosts, notably
+      // x86, so we must not use these types.
       assert(sizeof(double) == sizeof(uint64_t) &&
              "assuming that double is 64 bits!");
-      Out << "0x" << utohexstr(DoubleToBits(Val));
+      char Buffer[40];
+      APFloat apf = CFP->getValueAPF();
+      // Floats are represented in ASCII IR as double, convert.
+      if (!isDouble)
+        apf.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 
+                          &ignored);
+      Out << "0x" << 
+              utohex_buffer(uint64_t(apf.bitcastToAPInt().getZExtValue()), 
+                            Buffer+40);
       return;
     }
     
@@ -732,7 +727,6 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
     } else {                // Cannot output in string format...
       Out << '[';
       if (CA->getNumOperands()) {
-        Out << ' ';
         printTypeInt(Out, ETy, TypeTable);
         Out << ' ';
         WriteAsOperandInternal(Out, CA->getOperand(0),
@@ -743,7 +737,6 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
           Out << ' ';
           WriteAsOperandInternal(Out, CA->getOperand(i), TypeTable, Machine);
         }
-        Out << ' ';
       }
       Out << ']';
     }
@@ -782,7 +775,7 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
     const Type *ETy = CP->getType()->getElementType();
     assert(CP->getNumOperands() > 0 &&
            "Number of operands for a PackedConst must be > 0");
-    Out << "< ";
+    Out << '<';
     printTypeInt(Out, ETy, TypeTable);
     Out << ' ';
     WriteAsOperandInternal(Out, CP->getOperand(0), TypeTable, Machine);
@@ -792,7 +785,7 @@ static void WriteConstantInt(raw_ostream &Out, const Constant *CV,
       Out << ' ';
       WriteAsOperandInternal(Out, CP->getOperand(i), TypeTable, Machine);
     }
-    Out << " >";
+    Out << '>';
     return;
   }
   
@@ -1164,6 +1157,7 @@ void AssemblyWriter::printModule(const Module *M) {
 
 static void PrintLinkage(GlobalValue::LinkageTypes LT, raw_ostream &Out) {
   switch (LT) {
+  case GlobalValue::PrivateLinkage:      Out << "private "; break;
   case GlobalValue::InternalLinkage:     Out << "internal "; break;
   case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
   case GlobalValue::WeakLinkage:         Out << "weak "; break;
@@ -1203,6 +1197,8 @@ void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
   PrintVisibility(GV->getVisibility(), Out);
 
   if (GV->isThreadLocal()) Out << "thread_local ";
+  if (unsigned AddressSpace = GV->getType()->getAddressSpace())
+    Out << "addrspace(" << AddressSpace << ") ";
   Out << (GV->isConstant() ? "constant " : "global ");
   printType(GV->getType()->getElementType());
 
@@ -1210,9 +1206,6 @@ void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
     Out << ' ';
     writeOperand(GV->getInitializer(), false);
   }
-
-  if (unsigned AddressSpace = GV->getType()->getAddressSpace())
-    Out << " addrspace(" << AddressSpace << ") ";
     
   if (GV->hasSection())
     Out << ", section \"" << GV->getSection() << '"';
@@ -1247,10 +1240,7 @@ void AssemblyWriter::printAlias(const GlobalAlias *GA) {
     printType(F->getFunctionType());
     Out << "* ";
 
-    if (F->hasName())
-      PrintLLVMName(Out, F);
-    else
-      Out << "@\"\"";
+    WriteAsOperandInternal(Out, F, TypeNames, &Machine);
   } else if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(Aliasee)) {
     printType(GA->getType());
     Out << " ";
@@ -1317,10 +1307,7 @@ void AssemblyWriter::printFunction(const Function *F) {
     Out <<  Attribute::getAsString(Attrs.getRetAttributes()) << ' ';
   printType(F->getReturnType());
   Out << ' ';
-  if (F->hasName())
-    PrintLLVMName(Out, F);
-  else
-    Out << "@\"\"";
+  WriteAsOperandInternal(Out, F, TypeNames, &Machine);
   Out << '(';
   Machine.incorporateFunction(F);
 
@@ -1510,13 +1497,14 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
   const Value *Operand = I.getNumOperands() ? I.getOperand(0) : 0;
 
   // Special case conditional branches to swizzle the condition out to the front
-  if (isa<BranchInst>(I) && I.getNumOperands() > 1) {
+  if (isa<BranchInst>(I) && cast<BranchInst>(I).isConditional()) {
+    BranchInst &BI(cast<BranchInst>(I));
     Out << ' ';
-    writeOperand(I.getOperand(2), true);
+    writeOperand(BI.getCondition(), true);
     Out << ", ";
-    writeOperand(Operand, true);
+    writeOperand(BI.getSuccessor(0), true);
     Out << ", ";
-    writeOperand(I.getOperand(1), true);
+    writeOperand(BI.getSuccessor(1), true);
 
   } else if (isa<SwitchInst>(I)) {
     // Special case switch statement to get formatting nice and correct...
@@ -1622,16 +1610,16 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     // only do this if the first argument is a pointer to a nonvararg function,
     // and if the return type is not a pointer to a function.
     //
+    Out << ' ';
     if (!FTy->isVarArg() &&
         (!isa<PointerType>(RetTy) ||
          !isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
-      Out << ' '; printType(RetTy);
+      printType(RetTy);
+      Out << ' ';
       writeOperand(Operand, false);
     } else {
-      Out << ' ';
       writeOperand(Operand, true);
     }
-
     Out << '(';
     for (unsigned op = 3, Eop = I.getNumOperands(); op < Eop; ++op) {
       if (op > 3)
@@ -1687,7 +1675,9 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     } else {
       for (unsigned i = 1, E = I.getNumOperands(); i != E; ++i) {
         Operand = I.getOperand(i);
-        if (Operand->getType() != TheType) {
+        // note that Operand shouldn't be null, but the test helps make dump()
+        // more tolerant of malformed IR
+        if (Operand && Operand->getType() != TheType) {
           PrintAllTypes = true;    // We have differing types!  Print them all!
           break;
         }
@@ -1774,8 +1764,7 @@ void Value::print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const {
   } else if (isa<InlineAsm>(this)) {
     WriteAsOperand(OS, this, true, 0);
   } else {
-    // FIXME: PseudoSourceValue breaks this!
-    //assert(0 && "Unknown value to print out!");
+    assert(0 && "Unknown value to print out!");
   }
 }