Prevent a crash in debug dumps.
[oota-llvm.git] / lib / VMCore / Function.cpp
index 302eff30ff3f2cb01ee86132925ad2d0163da5cc..2ab1194949653e9a2b96575a4e2b5e73b263bca1 100644 (file)
@@ -106,10 +106,22 @@ bool Argument::hasNoAliasAttr() const {
 /// it in its containing function.
 bool Argument::hasStructRetAttr() const {
   if (!isa<PointerType>(getType())) return false;
-  if (this != getParent()->arg_begin()) return false; // StructRet param must be first param
+  if (this != getParent()->arg_begin())
+    return false; // StructRet param must be first param
   return getParent()->paramHasAttr(1, ParamAttr::StructRet);
 }
 
+/// addAttr - Add a ParamAttr to an argument
+void Argument::addAttr(ParameterAttributes attr) {
+  getParent()->setParamAttrs(
+    getParent()->getParamAttrs().addAttr(getArgNo() + 1, attr));
+}
+  
+/// removeAttr - Remove a ParamAttr from an argument
+void Argument::removeAttr(ParameterAttributes attr) {
+  getParent()->setParamAttrs(
+    getParent()->getParamAttrs().removeAttr(getArgNo() + 1, attr));
+}
 
 
 
@@ -160,6 +172,10 @@ Function::Function(const FunctionType *Ty, LinkageTypes Linkage,
 
   if (ParentModule)
     ParentModule->getFunctionList().push_back(this);
+
+  // Ensure intrinsics have the right parameter attributes.
+  if (unsigned IID = getIntrinsicID(true))
+    setParamAttrs(Intrinsic::getParamAttrs(Intrinsic::ID(IID)));
 }
 
 Function::~Function() {
@@ -215,6 +231,21 @@ void Function::dropAllReferences() {
   BasicBlocks.clear();    // Delete all basic blocks...
 }
 
+void Function::setDoesNotThrow(bool doesNotThrow) {
+  PAListPtr PAL = getParamAttrs();
+  if (doesNotThrow)
+    PAL = PAL.addAttr(0, ParamAttr::NoUnwind);
+  else
+    PAL = PAL.removeAttr(0, ParamAttr::NoUnwind);
+  setParamAttrs(PAL);
+}
+
+void Function::addParamAttr(unsigned i, ParameterAttributes attr) {
+  PAListPtr PAL = getParamAttrs();
+  PAL = PAL.addAttr(i, attr);
+  setParamAttrs(PAL);
+}
+
 // Maintain the collector name for each function in an on-the-side table. This
 // saves allocating an additional word in Function for programs which do not use
 // GC (i.e., most programs) at the cost of increased overhead for clients which
@@ -253,6 +284,18 @@ void Function::clearCollector() {
   }
 }
 
+/// copyAttributesFrom - copy all additional attributes (those not needed to
+/// create a Function) from the Function Src to this one.
+void Function::copyAttributesFrom(const GlobalValue *Src) {
+  assert(isa<Function>(Src) && "Expected a Function!");
+  GlobalValue::copyAttributesFrom(Src);
+  const Function *SrcF = cast<Function>(Src);
+  setCallingConv(SrcF->getCallingConv());
+  setParamAttrs(SrcF->getParamAttrs());
+  if (SrcF->hasCollector())
+    setCollector(SrcF->getCollector());
+}
+
 /// getIntrinsicID - This method returns the ID number of the specified
 /// function, or Intrinsic::not_intrinsic if the function is not an
 /// intrinsic, or if the pointer is null.  This value is always defined to be
@@ -328,35 +371,9 @@ Function *Intrinsic::getDeclaration(Module *M, ID id, const Type **Tys,
                                     unsigned numTys) {
   // There can never be multiple globals with the same name of different types,
   // because intrinsics must be a specific type.
-  Function *F =
+  return
     cast<Function>(M->getOrInsertFunction(getName(id, Tys, numTys),
                                           getType(id, Tys, numTys)));
-  F->setParamAttrs(getParamAttrs(id));
-  return F;
-}
-
-Value *IntrinsicInst::StripPointerCasts(Value *Ptr) {
-  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr)) {
-    if (CE->getOpcode() == Instruction::BitCast) {
-      if (isa<PointerType>(CE->getOperand(0)->getType()))
-        return StripPointerCasts(CE->getOperand(0));
-    } else if (CE->getOpcode() == Instruction::GetElementPtr) {
-      for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i)
-        if (!CE->getOperand(i)->isNullValue())
-          return Ptr;
-      return StripPointerCasts(CE->getOperand(0));
-    }
-    return Ptr;
-  }
-
-  if (BitCastInst *CI = dyn_cast<BitCastInst>(Ptr)) {
-    if (isa<PointerType>(CI->getOperand(0)->getType()))
-      return StripPointerCasts(CI->getOperand(0));
-  } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr)) {
-    if (GEP->hasAllZeroIndices())
-      return StripPointerCasts(GEP->getOperand(0));
-  }
-  return Ptr;
 }
 
 // vim: sw=2 ai