X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FFunction.cpp;h=a859a2b04a259ba45c0d7bf3b8750b7851bcda70;hb=02a3be020a6b4eedb4b489959997d23a22cdf22e;hp=89195a34a42cd294d559e72ecb6fd68ca6993aeb;hpb=c436b37262fd1552fd591f50e14a7ff0067465e2;p=oota-llvm.git diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 89195a34a42..a859a2b04a2 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -104,8 +104,6 @@ Function::Function(const FunctionType *Ty, LinkageTypes Linkage, Function::~Function() { dropAllReferences(); // After this it is safe to delete instructions. - BasicBlocks.clear(); // Delete all basic blocks... - // Delete all of the method arguments and unlink from symbol table... ArgumentList.clear(); ArgumentList.setParent(0); @@ -149,6 +147,7 @@ const Type *Function::getReturnType() const { void Function::dropAllReferences() { for (iterator I = begin(), E = end(); I != E; ++I) I->dropAllReferences(); + BasicBlocks.clear(); // Delete all basic blocks... } /// getIntrinsicID - This method returns the ID number of the specified @@ -159,16 +158,51 @@ void Function::dropAllReferences() { /// llvm/Intrinsics.h. /// unsigned Function::getIntrinsicID() const { - if (getName().size() <= 5 || getName()[4] != '.' || getName()[0] != 'l' || + if (getName().size() < 5 || getName()[4] != '.' || getName()[0] != 'l' || getName()[1] != 'l' || getName()[2] != 'v' || getName()[3] != 'm') return 0; // All intrinsics start with 'llvm.' + + assert(getName().size() != 5 && "'llvm.' is an invalid intrinsic name!"); + // a table of all Alpha intrinsic functions + struct { + std::string name; // The name of the intrinsic + unsigned id; // Its ID number + } alpha_intrinsics[] = { + { "llvm.alpha.ctlz", LLVMIntrinsic::alpha_ctlz }, + { "llvm.alpha.cttz", LLVMIntrinsic::alpha_cttz }, + { "llvm.alpha.ctpop", LLVMIntrinsic::alpha_ctpop }, + { "llvm.alpha.umulh", LLVMIntrinsic::alpha_umulh }, + { "llvm.alpha.vecop", LLVMIntrinsic::alpha_vecop }, + { "llvm.alpha.pup", LLVMIntrinsic::alpha_pup }, + { "llvm.alpha.bytezap", LLVMIntrinsic::alpha_bytezap }, + { "llvm.alpha.bytemanip", LLVMIntrinsic::alpha_bytemanip }, + { "llvm.alpha.dfp_bop", LLVMIntrinsic::alpha_dfpbop }, + { "llvm.alpha.dfp_uop", LLVMIntrinsic::alpha_dfpuop }, + { "llvm.alpha.unordered", LLVMIntrinsic::alpha_unordered }, + { "llvm.alpha.uqtodfp", LLVMIntrinsic::alpha_uqtodfp }, + { "llvm.alpha.uqtosfp", LLVMIntrinsic::alpha_uqtosfp }, + { "llvm.alpha.dfptosq", LLVMIntrinsic::alpha_dfptosq }, + { "llvm.alpha.sfptosq", LLVMIntrinsic::alpha_sfptosq }, + }; + const unsigned num_alpha_intrinsics = + sizeof(alpha_intrinsics) / sizeof(*alpha_intrinsics); + switch (getName()[5]) { + case 'a': + if (getName().size() > 11 && + std::string(getName().begin()+4, getName().begin()+11) == ".alpha.") + for (unsigned i = 0; i < num_alpha_intrinsics; ++i) + if (getName() == alpha_intrinsics[i].name) + return alpha_intrinsics[i].id; + break; case 'l': if (getName() == "llvm.longjmp") return LLVMIntrinsic::longjmp; break; case 's': - if (getName() == "llvm.setjmp") return LLVMIntrinsic::setjmp; + if (getName() == "llvm.setjmp") return LLVMIntrinsic::setjmp; + if (getName() == "llvm.sigsetjmp") return LLVMIntrinsic::sigsetjmp; + if (getName() == "llvm.siglongjmp") return LLVMIntrinsic::siglongjmp; break; case 'v': if (getName() == "llvm.va_copy") return LLVMIntrinsic::va_copy;