X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FFunction.cpp;h=a859a2b04a259ba45c0d7bf3b8750b7851bcda70;hb=02a3be020a6b4eedb4b489959997d23a22cdf22e;hp=3324565654b0f1bd32f61779874967e7ec5e4d9a;hpb=4ad02e726d9b634372b037d4b352d8b63bb9e849;p=oota-llvm.git diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 3324565654b..a859a2b04a2 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -8,6 +8,7 @@ #include "llvm/Module.h" #include "llvm/DerivedTypes.h" #include "llvm/iOther.h" +#include "llvm/Intrinsics.h" #include "Support/LeakDetector.h" #include "SymbolTableListTraitsImpl.h" @@ -103,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); @@ -148,8 +147,75 @@ 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 +/// function, or LLVMIntrinsic::not_intrinsic if the function is not an +/// instrinsic, or if the pointer is null. This value is always defined to be +/// zero to allow easy checking for whether a function is intrinsic or not. The +/// particular intrinsic functions which correspond to this value are defined in +/// llvm/Intrinsics.h. +/// +unsigned Function::getIntrinsicID() const { + 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.sigsetjmp") return LLVMIntrinsic::sigsetjmp; + if (getName() == "llvm.siglongjmp") return LLVMIntrinsic::siglongjmp; + break; + case 'v': + if (getName() == "llvm.va_copy") return LLVMIntrinsic::va_copy; + if (getName() == "llvm.va_end") return LLVMIntrinsic::va_end; + if (getName() == "llvm.va_start") return LLVMIntrinsic::va_start; + break; + } + // The "llvm." namespace is reserved! + assert(0 && "Unknown LLVM intrinsic function!"); + return 0; +} + + //===----------------------------------------------------------------------===// // GlobalVariable Implementation //===----------------------------------------------------------------------===//