Add comment.
[oota-llvm.git] / lib / VMCore / AsmWriter.cpp
index 9592151c6d924aed9b7865330e1c42882eb6f466..55d037db141db02ae4fe7d1d3d0807bd9255afcb 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -20,7 +20,7 @@
 #include "llvm/CallingConv.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
-#include "llvm/ParameterAttributes.h"
+#include "llvm/ParamAttrsList.h"
 #include "llvm/InlineAsm.h"
 #include "llvm/Instruction.h"
 #include "llvm/Instructions.h"
@@ -57,10 +57,10 @@ public:
 /// @{
 public:
   /// @brief Construct from a module
-  SlotMachine(const Module *M);
+  explicit SlotMachine(const Module *M);
 
   /// @brief Construct from a function, starting out in incorp state.
-  SlotMachine(const Function *F);
+  explicit SlotMachine(const Function *F);
 
 /// @}
 /// @name Accessors
@@ -305,28 +305,17 @@ static void calcTypeName(const Type *Ty,
     const FunctionType *FTy = cast<FunctionType>(Ty);
     calcTypeName(FTy->getReturnType(), TypeStack, TypeNames, Result);
     Result += " (";
-    unsigned Idx = 1;
-    const ParamAttrsList *Attrs = FTy->getParamAttrs();
     for (FunctionType::param_iterator I = FTy->param_begin(),
-           E = FTy->param_end(); I != E; ++I) {
+         E = FTy->param_end(); I != E; ++I) {
       if (I != FTy->param_begin())
         Result += ", ";
       calcTypeName(*I, TypeStack, TypeNames, Result);
-      if (Attrs && Attrs->getParamAttrs(Idx) != ParamAttr::None) {
-        Result += + " ";
-        Result += Attrs->getParamAttrsTextByIndex(Idx);
-      }
-      Idx++;
     }
     if (FTy->isVarArg()) {
       if (FTy->getNumParams()) Result += ", ";
       Result += "...";
     }
     Result += ")";
-    if (Attrs && Attrs->getParamAttrs(0) != ParamAttr::None) {
-      Result += " ";
-      Result += Attrs->getParamAttrsTextByIndex(0);
-    }
     break;
   }
   case Type::StructTyID: {
@@ -345,11 +334,15 @@ static void calcTypeName(const Type *Ty,
       Result += '>';
     break;
   }
-  case Type::PointerTyID:
-    calcTypeName(cast<PointerType>(Ty)->getElementType(),
+  case Type::PointerTyID: {
+    const PointerType *PTy = cast<PointerType>(Ty);
+    calcTypeName(PTy->getElementType(),
                           TypeStack, TypeNames, Result);
+    if (unsigned AddressSpace = PTy->getAddressSpace())
+      Result += " addrspace(" + utostr(AddressSpace) + ")";
     Result += "*";
     break;
+  }
   case Type::ArrayTyID: {
     const ArrayType *ATy = cast<ArrayType>(Ty);
     Result += "[" + utostr(ATy->getNumElements()) + " x ";
@@ -749,6 +742,7 @@ public:
   inline void write(const Type *Ty)          { printType(Ty);        }
 
   void writeOperand(const Value *Op, bool PrintType);
+  void writeParamOperand(const Value *Operand, ParameterAttributes Attrs);
 
   const Module* getModule() { return TheModule; }
 
@@ -758,7 +752,7 @@ private:
   void printGlobal(const GlobalVariable *GV);
   void printAlias(const GlobalAlias *GV);
   void printFunction(const Function *F);
-  void printArgument(const Argument *FA, uint16_t ParamAttrs);
+  void printArgument(const Argument *FA, ParameterAttributes Attrs);
   void printBasicBlock(const BasicBlock *BB);
   void printInstruction(const Instruction &I);
 
@@ -789,25 +783,17 @@ std::ostream &AssemblyWriter::printTypeAtLeastOneLevel(const Type *Ty) {
   else if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
     printType(FTy->getReturnType());
     Out << " (";
-    unsigned Idx = 1;
-    const ParamAttrsList *Attrs = FTy->getParamAttrs();
     for (FunctionType::param_iterator I = FTy->param_begin(),
            E = FTy->param_end(); I != E; ++I) {
       if (I != FTy->param_begin())
         Out << ", ";
       printType(*I);
-      if (Attrs && Attrs->getParamAttrs(Idx) != ParamAttr::None) {
-        Out << " " << Attrs->getParamAttrsTextByIndex(Idx);
-      }
-      Idx++;
     }
     if (FTy->isVarArg()) {
       if (FTy->getNumParams()) Out << ", ";
       Out << "...";
     }
     Out << ')';
-    if (Attrs && Attrs->getParamAttrs(0) != ParamAttr::None)
-      Out << ' ' << Attrs->getParamAttrsTextByIndex(0);
   } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
     if (STy->isPacked())
       Out << '<';
@@ -822,7 +808,10 @@ std::ostream &AssemblyWriter::printTypeAtLeastOneLevel(const Type *Ty) {
     if (STy->isPacked())
       Out << '>';
   } else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
-    printType(PTy->getElementType()) << '*';
+    printType(PTy->getElementType());
+    if (unsigned AddressSpace = PTy->getAddressSpace())
+      Out << " addrspace(" << AddressSpace << ")";
+    Out << '*';
   } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
     Out << '[' << ATy->getNumElements() << " x ";
     printType(ATy->getElementType()) << ']';
@@ -850,6 +839,21 @@ void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType) {
   }
 }
 
+void AssemblyWriter::writeParamOperand(const Value *Operand, 
+                                       ParameterAttributes Attrs) {
+  if (Operand == 0) {
+    Out << "<null operand!>";
+  } else {
+    Out << ' ';
+    // Print the type
+    printType(Operand->getType());
+    // Print parameter attributes list
+    if (Attrs != ParamAttr::None)
+      Out << ' ' << ParamAttrsList::getParamAttrsText(Attrs);
+    // Print the operand
+    WriteAsOperandInternal(Out, Operand, TypeNames, &Machine);
+  }
+}
 
 void AssemblyWriter::printModule(const Module *M) {
   if (!M->getModuleIdentifier().empty() &&
@@ -918,12 +922,13 @@ void AssemblyWriter::printModule(const Module *M) {
 void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
   if (GV->hasName()) Out << getLLVMName(GV->getName(), GlobalPrefix) << " = ";
 
-  if (!GV->hasInitializer())
+  if (!GV->hasInitializer()) {
     switch (GV->getLinkage()) {
      case GlobalValue::DLLImportLinkage:   Out << "dllimport "; break;
      case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
      default: Out << "external "; break;
-    } else {
+    }
+  } else {
     switch (GV->getLinkage()) {
     case GlobalValue::InternalLinkage:     Out << "internal "; break;
     case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
@@ -955,6 +960,9 @@ void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
     writeOperand(GV->getInitializer(), false);
   }
 
+  if (unsigned AddressSpace = GV->getType()->getAddressSpace())
+    Out << " addrspace(" << AddressSpace << ") ";
+    
   if (GV->hasSection())
     Out << ", section \"" << GV->getSection() << '"';
   if (GV->getAlignment())
@@ -1066,7 +1074,7 @@ void AssemblyWriter::printFunction(const Function *F) {
   }
 
   const FunctionType *FT = F->getFunctionType();
-  const ParamAttrsList *Attrs = FT->getParamAttrs();
+  const ParamAttrsList *Attrs = F->getParamAttrs();
   printType(F->getReturnType()) << ' ';
   if (!F->getName().empty())
     Out << getLLVMName(F->getName(), GlobalPrefix);
@@ -1085,7 +1093,7 @@ void AssemblyWriter::printFunction(const Function *F) {
       // Insert commas as we go... the first arg doesn't get a comma
       if (I != F->arg_begin()) Out << ", ";
       printArgument(I, (Attrs ? Attrs->getParamAttrs(Idx)
-                              : uint16_t(ParamAttr::None)));
+                              : ParamAttr::None));
       Idx++;
     }
   } else {
@@ -1097,7 +1105,7 @@ void AssemblyWriter::printFunction(const Function *F) {
       // Output type...
       printType(FT->getParamType(i));
       
-      unsigned ArgAttrs = ParamAttr::None;
+      ParameterAttributes ArgAttrs = ParamAttr::None;
       if (Attrs) ArgAttrs = Attrs->getParamAttrs(i+1);
       if (ArgAttrs != ParamAttr::None)
         Out << ' ' << ParamAttrsList::getParamAttrsText(ArgAttrs);
@@ -1116,6 +1124,8 @@ void AssemblyWriter::printFunction(const Function *F) {
     Out << " section \"" << F->getSection() << '"';
   if (F->getAlignment())
     Out << " align " << F->getAlignment();
+  if (F->hasCollector())
+    Out << " gc \"" << F->getCollector() << '"';
 
   if (F->isDeclaration()) {
     Out << "\n";
@@ -1135,10 +1145,12 @@ void AssemblyWriter::printFunction(const Function *F) {
 /// printArgument - This member is called for every argument that is passed into
 /// the function.  Simply print it out
 ///
-void AssemblyWriter::printArgument(const Argument *Arg, uint16_t Attrs) {
+void AssemblyWriter::printArgument(const Argument *Arg, 
+                                   ParameterAttributes Attrs) {
   // Output type...
   printType(Arg->getType());
 
+  // Output parameter attributes list
   if (Attrs != ParamAttr::None)
     Out << ' ' << ParamAttrsList::getParamAttrsText(Attrs);
 
@@ -1279,6 +1291,9 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
       writeOperand(I.getOperand(op  ), false); Out << ',';
       writeOperand(I.getOperand(op+1), false); Out << " ]";
     }
+  } else if (const GetResultInst *GRI = dyn_cast<GetResultInst>(&I)) {
+    writeOperand(I.getOperand(0), true);
+    Out << ", " << GRI->getIndex();
   } else if (isa<ReturnInst>(I) && !Operand) {
     Out << " void";
   } else if (const CallInst *CI = dyn_cast<CallInst>(&I)) {
@@ -1287,15 +1302,15 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     case CallingConv::C: break;   // default
     case CallingConv::Fast:  Out << " fastcc"; break;
     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_StdCall:  Out << " x86_stdcallcc"; break;
+    case CallingConv::X86_FastCall: Out << " x86_fastcallcc"; 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 ParamAttrsList *PAL = FTy->getParamAttrs();
+    const ParamAttrsList *PAL = CI->getParamAttrs();
 
     // 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,
@@ -1313,9 +1328,8 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     for (unsigned op = 1, Eop = I.getNumOperands(); op < Eop; ++op) {
       if (op > 1)
         Out << ',';
-      writeOperand(I.getOperand(op), true);
-      if (PAL && PAL->getParamAttrs(op) != ParamAttr::None)
-        Out << " " << PAL->getParamAttrsTextByIndex(op);
+      writeParamOperand(I.getOperand(op), PAL ? PAL->getParamAttrs(op) : 
+                                          ParamAttr::None);
     }
     Out << " )";
     if (PAL && PAL->getParamAttrs(0) != ParamAttr::None)
@@ -1324,7 +1338,7 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     const PointerType    *PTy = cast<PointerType>(Operand->getType());
     const FunctionType   *FTy = cast<FunctionType>(PTy->getElementType());
     const Type         *RetTy = FTy->getReturnType();
-    const ParamAttrsList *PAL = FTy->getParamAttrs();
+    const ParamAttrsList *PAL = II->getParamAttrs();
 
     // Print the calling convention being used.
     switch (II->getCallingConv()) {
@@ -1353,9 +1367,8 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
     for (unsigned op = 3, Eop = I.getNumOperands(); op < Eop; ++op) {
       if (op > 3)
         Out << ',';
-      writeOperand(I.getOperand(op), true);
-      if (PAL && PAL->getParamAttrs(op-2) != ParamAttr::None)
-        Out << " " << PAL->getParamAttrsTextByIndex(op-2);
+      writeParamOperand(I.getOperand(op), PAL ? PAL->getParamAttrs(op-2) : 
+                                          ParamAttr::None);
     }
 
     Out << " )";
@@ -1509,9 +1522,10 @@ ParamAttrsList::dump() const {
   cerr << "PAL[ ";
   for (unsigned i = 0; i < attrs.size(); ++i) {
     uint16_t index = getParamIndex(i);
-    uint16_t attrs = getParamAttrs(index);
+    ParameterAttributes attrs = getParamAttrs(index);
     cerr << "{" << index << "," << attrs << "} ";
   }
+
   cerr << "]\n";
 }