Verify function attributes.
[oota-llvm.git] / lib / VMCore / AsmWriter.cpp
index 1fb229be33c6da6787d0c4ca28688578e98a1cf1..c3186f69a5ca07e6aaafc8cc38415d877ca0d9f4 100644 (file)
@@ -385,7 +385,7 @@ int SlotTracker::getGlobalSlot(const GlobalValue *V) {
   
   // Find the type plane in the module map
   ValueMap::iterator MI = mMap.find(V);
-  return MI == mMap.end() ? -1 : MI->second;
+  return MI == mMap.end() ? -1 : (int)MI->second;
 }
 
 
@@ -397,7 +397,7 @@ int SlotTracker::getLocalSlot(const Value *V) {
   initialize();
   
   ValueMap::iterator FI = fMap.find(V);
-  return FI == fMap.end() ? -1 : FI->second;
+  return FI == fMap.end() ? -1 : (int)FI->second;
 }
 
 
@@ -1134,8 +1134,8 @@ void AssemblyWriter::writeParamOperand(const Value *Operand,
     // Print the type
     printType(Operand->getType());
     // Print parameter attributes list
-    if (Attrs != ParamAttr::None)
-      Out << ' ' << ParamAttr::getAsString(Attrs);
+    if (Attrs != Attribute::None)
+      Out << ' ' << Attribute::getAsString(Attrs);
     Out << ' ';
     // Print the operand
     WriteAsOperandInternal(Out, Operand, TypeNames, &Machine);
@@ -1351,12 +1351,14 @@ void AssemblyWriter::printFunction(const Function *F) {
   case CallingConv::Cold:         Out << "coldcc "; break;
   case CallingConv::X86_StdCall:  Out << "x86_stdcallcc "; break;
   case CallingConv::X86_FastCall: Out << "x86_fastcallcc "; break; 
-  case CallingConv::X86_SSECall:  Out << "x86_ssecallcc "; break;
   default: Out << "cc" << F->getCallingConv() << " "; break;
   }
 
   const FunctionType *FT = F->getFunctionType();
-  const PAListPtr &Attrs = F->getParamAttrs();
+  const AttrListPtr &Attrs = F->getAttributes();
+  Attributes RetAttrs = Attrs.getRetAttributes();
+  if (RetAttrs != Attribute::None)
+    Out <<  Attribute::getAsString(Attrs.getRetAttributes()) << ' ';
   printType(F->getReturnType());
   Out << ' ';
   if (F->hasName())
@@ -1375,7 +1377,7 @@ void AssemblyWriter::printFunction(const Function *F) {
          I != E; ++I) {
       // Insert commas as we go... the first arg doesn't get a comma
       if (I != F->arg_begin()) Out << ", ";
-      printArgument(I, Attrs.getParamAttrs(Idx));
+      printArgument(I, Attrs.getParamAttributes(Idx));
       Idx++;
     }
   } else {
@@ -1387,9 +1389,9 @@ void AssemblyWriter::printFunction(const Function *F) {
       // Output type...
       printType(FT->getParamType(i));
       
-      Attributes ArgAttrs = Attrs.getParamAttrs(i+1);
-      if (ArgAttrs != ParamAttr::None)
-        Out << ' ' << ParamAttr::getAsString(ArgAttrs);
+      Attributes ArgAttrs = Attrs.getParamAttributes(i+1);
+      if (ArgAttrs != Attribute::None)
+        Out << ' ' << Attribute::getAsString(ArgAttrs);
     }
   }
 
@@ -1399,9 +1401,9 @@ void AssemblyWriter::printFunction(const Function *F) {
     Out << "...";  // Output varargs portion of signature!
   }
   Out << ')';
-  Attributes RetAttrs = Attrs.getParamAttrs(0);
-  if (RetAttrs != ParamAttr::None)
-    Out << ' ' << ParamAttr::getAsString(Attrs.getParamAttrs(0));
+  Attributes FnAttrs = Attrs.getFnAttributes();
+  if (FnAttrs != Attribute::None)
+    Out << ' ' << Attribute::getAsString(Attrs.getFnAttributes());
   if (F->hasSection())
     Out << " section \"" << F->getSection() << '"';
   if (F->getAlignment())
@@ -1411,34 +1413,6 @@ void AssemblyWriter::printFunction(const Function *F) {
   if (F->isDeclaration()) {
     Out << "\n";
   } else {
-
-    bool insideNotes = false;
-    if (F->hasNote(FnAttr::AlwaysInline)) {
-      Out << "notes(";
-      insideNotes = true;
-      Out << "inline=always";
-    }
-    if (F->hasNote(FnAttr::NoInline)) {
-      if (insideNotes) 
-        Out << ",";
-      else {
-        Out << "notes(";
-        insideNotes = true;
-      }
-      Out << "inline=never";
-    }
-    if (F->hasNote(FnAttr::OptimizeForSize)) {
-      if (insideNotes) 
-        Out << ",";
-      else {
-        Out << "notes(";
-        insideNotes = true;
-      }
-      Out << "opt_size";
-    }
-    if (insideNotes)
-      Out << ")";
-    
     Out << " {";
 
     // Output all of its basic blocks... for the function
@@ -1460,8 +1434,8 @@ void AssemblyWriter::printArgument(const Argument *Arg,
   printType(Arg->getType());
 
   // Output parameter attributes list
-  if (Attrs != ParamAttr::None)
-    Out << ' ' << ParamAttr::getAsString(Attrs);
+  if (Attrs != Attribute::None)
+    Out << ' ' << Attribute::getAsString(Attrs);
 
   // Output name, if available...
   if (Arg->hasName()) {
@@ -1635,14 +1609,16 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     case CallingConv::Cold:  Out << " coldcc"; break;
     case CallingConv::X86_StdCall:  Out << " x86_stdcallcc"; break;
     case CallingConv::X86_FastCall: Out << " x86_fastcallcc"; break; 
-    case CallingConv::X86_SSECall: Out << " x86_ssecallcc"; break; 
     default: Out << " cc" << CI->getCallingConv(); break;
     }
 
     const PointerType    *PTy = cast<PointerType>(Operand->getType());
     const FunctionType   *FTy = cast<FunctionType>(PTy->getElementType());
     const Type         *RetTy = FTy->getReturnType();
-    const PAListPtr &PAL = CI->getParamAttrs();
+    const AttrListPtr &PAL = CI->getAttributes();
+
+    if (PAL.getRetAttributes() != Attribute::None)
+      Out << ' ' << Attribute::getAsString(PAL.getRetAttributes());
 
     // If possible, print out the short form of the call instruction.  We can
     // only do this if the first argument is a pointer to a nonvararg function,
@@ -1662,16 +1638,16 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     for (unsigned op = 1, Eop = I.getNumOperands(); op < Eop; ++op) {
       if (op > 1)
         Out << ", ";
-      writeParamOperand(I.getOperand(op), PAL.getParamAttrs(op));
+      writeParamOperand(I.getOperand(op), PAL.getParamAttributes(op));
     }
     Out << ')';
-    if (PAL.getParamAttrs(0) != ParamAttr::None)
-      Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
+    if (PAL.getFnAttributes() != Attribute::None)
+      Out << ' ' << Attribute::getAsString(PAL.getFnAttributes());
   } else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I)) {
     const PointerType    *PTy = cast<PointerType>(Operand->getType());
     const FunctionType   *FTy = cast<FunctionType>(PTy->getElementType());
     const Type         *RetTy = FTy->getReturnType();
-    const PAListPtr &PAL = II->getParamAttrs();
+    const AttrListPtr &PAL = II->getAttributes();
 
     // Print the calling convention being used.
     switch (II->getCallingConv()) {
@@ -1680,10 +1656,12 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     case CallingConv::Cold:  Out << " coldcc"; break;
     case CallingConv::X86_StdCall:  Out << " x86_stdcallcc"; break;
     case CallingConv::X86_FastCall: Out << " x86_fastcallcc"; break;
-    case CallingConv::X86_SSECall: Out << " x86_ssecallcc"; break;
     default: Out << " cc" << II->getCallingConv(); break;
     }
 
+    if (PAL.getRetAttributes() != Attribute::None)
+      Out << ' ' << Attribute::getAsString(PAL.getRetAttributes());
+
     // If possible, print out the short form of the invoke instruction. We can
     // 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.
@@ -1702,12 +1680,13 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     for (unsigned op = 3, Eop = I.getNumOperands(); op < Eop; ++op) {
       if (op > 3)
         Out << ", ";
-      writeParamOperand(I.getOperand(op), PAL.getParamAttrs(op-2));
+      writeParamOperand(I.getOperand(op), PAL.getParamAttributes(op-2));
     }
 
     Out << ')';
-    if (PAL.getParamAttrs(0) != ParamAttr::None)
-      Out << ' ' << ParamAttr::getAsString(PAL.getParamAttrs(0));
+    if (PAL.getFnAttributes() != Attribute::None)
+      Out << ' ' << Attribute::getAsString(PAL.getFnAttributes());
+
     Out << "\n\t\t\tto ";
     writeOperand(II->getNormalDest(), true);
     Out << " unwind ";
@@ -1830,7 +1809,7 @@ void Value::print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const {
     AssemblyWriter W(OS, SlotTable, GV->getParent(), 0);
     W.write(GV);
   } else if (const Constant *C = dyn_cast<Constant>(this)) {
-    OS << ' ' << C->getType()->getDescription() << ' ';
+    OS << C->getType()->getDescription() << ' ';
     std::map<const Type *, std::string> TypeTable;
     WriteConstantInt(OS, C, TypeTable, 0);
   } else if (const Argument *A = dyn_cast<Argument>(this)) {
@@ -1855,6 +1834,14 @@ void Value::dump() const { print(errs()); errs() << '\n'; errs().flush(); }
 // Type::dump - allow easy printing of Types from the debugger.
 void Type::dump() const { print(errs()); errs() << '\n'; errs().flush(); }
 
+// Type::dump - allow easy printing of Types from the debugger.
+// This one uses type names from the given context module
+void Type::dump(const Module *Context) const {
+  WriteTypeSymbolic(errs(), this, Context);
+  errs() << '\n';
+  errs().flush();
+}
+
 // Module::dump() - Allow printing of Modules from the debugger.
 void Module::dump() const { print(errs(), 0); errs().flush(); }