/// Creates a hash-code for the function which is the same for any two /// functions that will compare equal, without looking at the instructions /// inside the function. static unsigned profileFunction(const Function *F) { FunctionType *FTy = F->getFunctionType(); FoldingSetNodeID ID; ID.AddInteger(F->size()); ID.AddInteger(F->getCallingConv()); ID.AddBoolean(F->hasGC()); ID.AddBoolean(FTy->isVarArg()); ID.AddInteger(getTypeIDForHash(FTy->getReturnType())); for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) ID.AddInteger(getTypeIDForHash(FTy->getParamType(i))); return ID.ComputeHash(); }
MDNode *MDNode::getMDNode(LLVMContext &Context, Value *const *Vals, unsigned NumVals, FunctionLocalness FL, bool Insert) { LLVMContextImpl *pImpl = Context.pImpl; bool isFunctionLocal = false; switch (FL) { case FL_Unknown: for (unsigned i = 0; i != NumVals; ++i) { Value *V = Vals[i]; if (!V) continue; if (isFunctionLocalValue(V)) { isFunctionLocal = true; break; } } break; case FL_No: isFunctionLocal = false; break; case FL_Yes: isFunctionLocal = true; break; } FoldingSetNodeID ID; for (unsigned i = 0; i != NumVals; ++i) ID.AddPointer(Vals[i]); ID.AddBoolean(isFunctionLocal); void *InsertPoint; MDNode *N = NULL; if ((N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint))) return N; if (!Insert) return NULL; // Coallocate space for the node and Operands together, then placement new. void *Ptr = malloc(sizeof(MDNode)+NumVals*sizeof(MDNodeOperand)); N = new (Ptr) MDNode(Context, Vals, NumVals, isFunctionLocal); // InsertPoint will have been set by the FindNodeOrInsertPos call. pImpl->MDNodeSet.InsertNode(N, InsertPoint); return N; }
void MDNode::Profile(FoldingSetNodeID &ID) const { for (unsigned i = 0, e = getNumOperands(); i != e; ++i) ID.AddPointer(getOperand(i)); ID.AddBoolean(isFunctionLocal()); }
void ConstantBool::Profile(FoldingSetNodeID &ID, const Type *Ty, const bool &Val) { ID.Add(Ty); ID.AddBoolean(Val); }