1cf3056db0fee1db7921214b1f25cea04e959e105Chris Lattner//===-- Function.cpp - Implement the Global object classes ----------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 10c2c50cdcdc19a1bca993c06d13d8cdca87083ce4Chandler Carruth// This file implements the Function class for the IR library. 11009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 154c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman#include "LLVMContextImpl.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "SymbolTableListTraitsImpl.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/DenseMap.h" 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/ValueTypes.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CallSite.h" 220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/InstIterator.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LeakDetector.h" 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 28b983d67465a939c43173e381f9063d9d9245f45bOwen Anderson#include "llvm/Support/ManagedStatic.h" 291f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/RWMutex.h" 30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/StringPool.h" 311f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Threading.h" 3231f8499e83dc4dccbb57ea7e76d1fd49b7010d0cChris Lattnerusing namespace llvm; 33d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 347e70829632f82de15db187845666aaca6e04b792Chris Lattner// Explicit instantiations of SymbolTableListTraits since some of the methods 357e70829632f82de15db187845666aaca6e04b792Chris Lattner// are not in the public header file... 36c63ca0a71b299ee0b8fc7dc8405d7f3c856ecfa3John McCalltemplate class llvm::SymbolTableListTraits<Argument, Function>; 37c63ca0a71b299ee0b8fc7dc8405d7f3c856ecfa3John McCalltemplate class llvm::SymbolTableListTraits<BasicBlock, Function>; 38009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 3970cc3397f84c2e1fd69c059a0ef89e398e847b00Chris Lattner//===----------------------------------------------------------------------===// 4080dd50b4aaee0ae609d21f8dded9c3af1e801b9eChris Lattner// Argument Implementation 4180dd50b4aaee0ae609d21f8dded9c3af1e801b9eChris Lattner//===----------------------------------------------------------------------===// 4280dd50b4aaee0ae609d21f8dded9c3af1e801b9eChris Lattner 432d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid Argument::anchor() { } 442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 45db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerArgument::Argument(Type *Ty, const Twine &Name, Function *Par) 46dec628eead87b20773c98a00830580df211acc98Chris Lattner : Value(Ty, Value::ArgumentVal) { 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Parent = nullptr; 48d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner 49d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner // Make sure that we get added to a function 50d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner LeakDetector::addGarbageObject(this); 51d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner 52bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner if (Par) 53bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner Par->getArgumentList().push_back(this); 54dec628eead87b20773c98a00830580df211acc98Chris Lattner setName(Name); 55bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner} 56bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner 57bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattnervoid Argument::setParent(Function *parent) { 58d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner if (getParent()) 59d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner LeakDetector::addGarbageObject(this); 60bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner Parent = parent; 61d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner if (getParent()) 62d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner LeakDetector::removeGarbageObject(this); 63bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner} 64bded132d00ed626a6541b67ad101ef0fd47d3491Chris Lattner 65de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner/// getArgNo - Return the index of this formal argument in its containing 660f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman/// function. For example in "void foo(int a, float b)" a is 0 and b is 1. 67de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattnerunsigned Argument::getArgNo() const { 68de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner const Function *F = getParent(); 69de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner assert(F && "Argument is not in a function"); 700f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 71de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner Function::const_arg_iterator AI = F->arg_begin(); 72de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner unsigned ArgIdx = 0; 73de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner for (; &*AI != this; ++AI) 74de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner ++ArgIdx; 75de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner 76de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner return ArgIdx; 77de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner} 78de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// hasNonNullAttr - Return true if this argument has the nonnull attribute on 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// it in its containing function. 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool Argument::hasNonNullAttr() const { 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!getType()->isPointerTy()) return false; 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return getParent()->getAttributes(). 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines hasAttribute(getArgNo()+1, Attribute::NonNull); 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 87de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner/// hasByValAttr - Return true if this argument has the byval attribute on it 88de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner/// in its containing function. 89de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattnerbool Argument::hasByValAttr() const { 901df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands if (!getType()->isPointerTy()) return false; 9139cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling return getParent()->getAttributes(). 9239cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling hasAttribute(getArgNo()+1, Attribute::ByVal); 93de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner} 94de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Return true if this argument has the inalloca attribute on it in 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// its containing function. 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool Argument::hasInAllocaAttr() const { 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!getType()->isPointerTy()) return false; 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return getParent()->getAttributes(). 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines hasAttribute(getArgNo()+1, Attribute::InAlloca); 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool Argument::hasByValOrInAllocaAttr() const { 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!getType()->isPointerTy()) return false; 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AttributeSet Attrs = getParent()->getAttributes(); 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Attrs.hasAttribute(getArgNo() + 1, Attribute::ByVal) || 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Attrs.hasAttribute(getArgNo() + 1, Attribute::InAlloca); 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 110ae441cc33cee83a598f74e3d0447fe02157b0389Chris Lattnerunsigned Argument::getParamAlignment() const { 111ae441cc33cee83a598f74e3d0447fe02157b0389Chris Lattner assert(getType()->isPointerTy() && "Only pointers have alignments"); 112ae441cc33cee83a598f74e3d0447fe02157b0389Chris Lattner return getParent()->getParamAlignment(getArgNo()+1); 1130f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 114ae441cc33cee83a598f74e3d0447fe02157b0389Chris Lattner} 115ae441cc33cee83a598f74e3d0447fe02157b0389Chris Lattner 116be1ce0a867a7e62094fc9a158c15bb9e48cb80faDuncan Sands/// hasNestAttr - Return true if this argument has the nest attribute on 117be1ce0a867a7e62094fc9a158c15bb9e48cb80faDuncan Sands/// it in its containing function. 118be1ce0a867a7e62094fc9a158c15bb9e48cb80faDuncan Sandsbool Argument::hasNestAttr() const { 1191df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands if (!getType()->isPointerTy()) return false; 12039cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling return getParent()->getAttributes(). 12139cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling hasAttribute(getArgNo()+1, Attribute::Nest); 122be1ce0a867a7e62094fc9a158c15bb9e48cb80faDuncan Sands} 123be1ce0a867a7e62094fc9a158c15bb9e48cb80faDuncan Sands 124de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner/// hasNoAliasAttr - Return true if this argument has the noalias attribute on 125de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner/// it in its containing function. 126de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattnerbool Argument::hasNoAliasAttr() const { 1271df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands if (!getType()->isPointerTy()) return false; 12839cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling return getParent()->getAttributes(). 12939cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling hasAttribute(getArgNo()+1, Attribute::NoAlias); 130de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner} 131de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner 13217da06ffbd1f7269b6b9037f883a3d8a5c985f62Duncan Sands/// hasNoCaptureAttr - Return true if this argument has the nocapture attribute 13317da06ffbd1f7269b6b9037f883a3d8a5c985f62Duncan Sands/// on it in its containing function. 13417da06ffbd1f7269b6b9037f883a3d8a5c985f62Duncan Sandsbool Argument::hasNoCaptureAttr() const { 1351df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands if (!getType()->isPointerTy()) return false; 13639cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling return getParent()->getAttributes(). 13739cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling hasAttribute(getArgNo()+1, Attribute::NoCapture); 13817da06ffbd1f7269b6b9037f883a3d8a5c985f62Duncan Sands} 13917da06ffbd1f7269b6b9037f883a3d8a5c985f62Duncan Sands 1407d54254c9cc6e5a3be3a7d9d22241c0ae8a7fa03Owen Anderson/// hasSRetAttr - Return true if this argument has the sret attribute on 1417d54254c9cc6e5a3be3a7d9d22241c0ae8a7fa03Owen Anderson/// it in its containing function. 1427d54254c9cc6e5a3be3a7d9d22241c0ae8a7fa03Owen Andersonbool Argument::hasStructRetAttr() const { 1431df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands if (!getType()->isPointerTy()) return false; 144b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif if (this != getParent()->arg_begin()) 145b1dbcd886a4b5597a839f299054b78b33fb2d6dfGabor Greif return false; // StructRet param must be first param 14639cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling return getParent()->getAttributes(). 14739cd0c8e477255a7296b2bd1dc67193f8d38c003Bill Wendling hasAttribute(1, Attribute::StructRet); 1487d54254c9cc6e5a3be3a7d9d22241c0ae8a7fa03Owen Anderson} 1497d54254c9cc6e5a3be3a7d9d22241c0ae8a7fa03Owen Anderson 150456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Lin/// hasReturnedAttr - Return true if this argument has the returned attribute on 151456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Lin/// it in its containing function. 152456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Linbool Argument::hasReturnedAttr() const { 153456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Lin return getParent()->getAttributes(). 154456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Lin hasAttribute(getArgNo()+1, Attribute::Returned); 155456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Lin} 156456ca048af35163b9f52187e92a23ee0a9f059e8Stephen Lin 157dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky/// Return true if this argument has the readonly or readnone attribute on it 158dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky/// in its containing function. 159dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewyckybool Argument::onlyReadsMemory() const { 160dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky return getParent()->getAttributes(). 161dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky hasAttribute(getArgNo()+1, Attribute::ReadOnly) || 162dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky getParent()->getAttributes(). 163dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky hasAttribute(getArgNo()+1, Attribute::ReadNone); 164dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky} 165dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky 16628d65722d6f283b327b5815914382077fe9c0ab4Bill Wendling/// addAttr - Add attributes to an argument. 16728d65722d6f283b327b5815914382077fe9c0ab4Bill Wendlingvoid Argument::addAttr(AttributeSet AS) { 168fece442c697eb29f14b4718bdafa3a97d545b476Bill Wendling assert(AS.getNumSlots() <= 1 && 169b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling "Trying to add more than one attribute set to an argument!"); 170b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling AttrBuilder B(AS, AS.getSlotIndex(0)); 171b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling getParent()->addAttributes(getArgNo() + 1, 172b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling AttributeSet::get(Parent->getContext(), 173b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling getArgNo() + 1, B)); 174e2435da8abe5ca62c7f08f29c242b6b98e0ec7afGordon Henriksen} 175cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands 17628d65722d6f283b327b5815914382077fe9c0ab4Bill Wendling/// removeAttr - Remove attributes from an argument. 17728d65722d6f283b327b5815914382077fe9c0ab4Bill Wendlingvoid Argument::removeAttr(AttributeSet AS) { 178fece442c697eb29f14b4718bdafa3a97d545b476Bill Wendling assert(AS.getNumSlots() <= 1 && 179b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling "Trying to remove more than one attribute set from an argument!"); 180b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling AttrBuilder B(AS, AS.getSlotIndex(0)); 181b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling getParent()->removeAttributes(getArgNo() + 1, 182b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling AttributeSet::get(Parent->getContext(), 183b7a1dda9c91b3d1821f4235c35a0d62c62d18848Bill Wendling getArgNo() + 1, B)); 184e2435da8abe5ca62c7f08f29c242b6b98e0ec7afGordon Henriksen} 185de6fa5f25f572b79b3dd7bbbe4dba78a54a4b2f8Chris Lattner 18680dd50b4aaee0ae609d21f8dded9c3af1e801b9eChris Lattner//===----------------------------------------------------------------------===// 18750ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattner// Helper Methods in Function 1884746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer//===----------------------------------------------------------------------===// 1894746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer 190e922c0201916e0b980ab3cfe91e1413e68d55647Owen AndersonLLVMContext &Function::getContext() const { 191e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson return getType()->getContext(); 19262fabf5faba70c507c8fbe298260e9b3749fdd79Owen Anderson} 19362fabf5faba70c507c8fbe298260e9b3749fdd79Owen Anderson 1941afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris LattnerFunctionType *Function::getFunctionType() const { 19550ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattner return cast<FunctionType>(getType()->getElementType()); 1964746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer} 1974746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer 19850ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattnerbool Function::isVarArg() const { 19950ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattner return getFunctionType()->isVarArg(); 2004746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer} 2014746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer 2021afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris LattnerType *Function::getReturnType() const { 20350ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattner return getFunctionType()->getReturnType(); 204827cde1c8319e51463007078a7ce3660ebc93036Duncan Sands} 205827cde1c8319e51463007078a7ce3660ebc93036Duncan Sands 20650ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattnervoid Function::removeFromParent() { 20750ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattner getParent()->getFunctionList().remove(this); 208827cde1c8319e51463007078a7ce3660ebc93036Duncan Sands} 209827cde1c8319e51463007078a7ce3660ebc93036Duncan Sands 21050ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattnervoid Function::eraseFromParent() { 21150ee9ddc8f0633af6cb0a5693a2c706e98f944daChris Lattner getParent()->getFunctionList().erase(this); 2124746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer} 2134746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer 2144746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer//===----------------------------------------------------------------------===// 21579df7c0aaa18129e55968c8783ef8346807bd4afChris Lattner// Function Implementation 21670cc3397f84c2e1fd69c059a0ef89e398e847b00Chris Lattner//===----------------------------------------------------------------------===// 21770cc3397f84c2e1fd69c059a0ef89e398e847b00Chris Lattner 218db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerFunction::Function(FunctionType *Ty, LinkageTypes Linkage, 2196e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar const Twine &name, Module *ParentModule) 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : GlobalObject(PointerType::getUnqual(Ty), 221dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Value::FunctionVal, nullptr, 0, Linkage, name) { 222c8e222b9a48a84e98a5fc4ccd6b015197b09bed4Chris Lattner assert(FunctionType::isValidReturnType(getReturnType()) && 2231afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner "invalid return type"); 224ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer SymTab = new ValueSymbolTable(); 225482701563a2ff76815d2cd19856469319e7c2d88Chris Lattner 2260162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner // If the function has arguments, mark them as lazily built. 2270162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner if (Ty->getNumParams()) 228cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner setValueSubclassData(1); // Set the "has lazy arguments" bit. 2290f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 230d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner // Make sure that we get added to a function 231d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner LeakDetector::addGarbageObject(this); 232d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner 233482701563a2ff76815d2cd19856469319e7c2d88Chris Lattner if (ParentModule) 234482701563a2ff76815d2cd19856469319e7c2d88Chris Lattner ParentModule->getFunctionList().push_back(this); 23579ab3e801480e6412c064a3fb15a79a8cab13efcDuncan Sands 23679ab3e801480e6412c064a3fb15a79a8cab13efcDuncan Sands // Ensure intrinsics have the right parameter attributes. 23749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen if (unsigned IID = getIntrinsicID()) 238cb3de0bc800d7920087b19bb12a545d4cc84114eBill Wendling setAttributes(Intrinsic::getAttributes(getContext(), Intrinsic::ID(IID))); 23981b2ab8a249c3652133a1dcc0209343cde9b499fDevang Patel 240009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 241009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 242afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon HenriksenFunction::~Function() { 243afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen dropAllReferences(); // After this it is safe to delete instructions. 244009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 245009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Delete all of the method arguments and unlink from symbol table... 246afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen ArgumentList.clear(); 247afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen delete SymTab; 248b90909e40536db17665727f5ca1c618e485464c3Reid Spencer 2495eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen // Remove the function from the on-the-side GC table. 2505eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen clearGC(); 2514c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman 2524c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman // Remove the intrinsicID from the Cache. 2531ac186e009af8496df3ecd2c5ad4918d5c53a0a3Chris Lattner if (getValueName() && isIntrinsic()) 2544c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman getContext().pImpl->IntrinsicIDCache.erase(this); 255009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 256009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 2570162c1815e5a1b33750d313c49f707bc446ea946Chris Lattnervoid Function::BuildLazyArguments() const { 2580162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner // Create the arguments vector, all arguments start out unnamed. 259db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FT = getFunctionType(); 2600162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i) { 261f012705c7e4ca8cf90b6b734ce1d5355daca5ba5Benjamin Kramer assert(!FT->getParamType(i)->isVoidTy() && 2620162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner "Cannot have void typed arguments!"); 2630162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner ArgumentList.push_back(new Argument(FT->getParamType(i))); 2640162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 2650f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 2660162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner // Clear the lazy arguments bit. 267cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner unsigned SDC = getSubclassDataFromValue(); 268cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner const_cast<Function*>(this)->setValueSubclassData(SDC &= ~1); 2690162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner} 2700162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner 2710162c1815e5a1b33750d313c49f707bc446ea946Chris Lattnersize_t Function::arg_size() const { 2720162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return getFunctionType()->getNumParams(); 2730162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner} 2740162c1815e5a1b33750d313c49f707bc446ea946Chris Lattnerbool Function::arg_empty() const { 2750162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return getFunctionType()->getNumParams() == 0; 2760162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner} 2770162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner 278e7506a366e8bd56c97d10beb68e4db953aebaecaChris Lattnervoid Function::setParent(Module *parent) { 279d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner if (getParent()) 280d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner LeakDetector::addGarbageObject(this); 281009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Parent = parent; 282d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner if (getParent()) 283d1e693f2a3883dacf213aa2b477540c57b53b714Chris Lattner LeakDetector::removeGarbageObject(this); 284009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 285009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 286009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// dropAllReferences() - This function causes all the subinstructions to "let 287009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// go" of all references that they are maintaining. This allows one to 288009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 'delete' a whole class at a time, even though there may be circular 289009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// references... first all references are dropped, and all use counts go to 2906b63452c3ad26678b32f93dbca55902a313ee4e9Misha Brukman// zero. Then everything is deleted for real. Note that no operations are 291fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// valid on an object that has "dropped all references", except operator 292009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// delete. 293009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 294e7506a366e8bd56c97d10beb68e4db953aebaecaChris Lattnervoid Function::dropAllReferences() { 2957e70829632f82de15db187845666aaca6e04b792Chris Lattner for (iterator I = begin(), E = end(); I != E; ++I) 2967e70829632f82de15db187845666aaca6e04b792Chris Lattner I->dropAllReferences(); 2970f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 298a6399ae08967109b1427b34b5bde775a38bb4d75Dan Gohman // Delete all basic blocks. They are now unused, except possibly by 299a6399ae08967109b1427b34b5bde775a38bb4d75Dan Gohman // blockaddresses, but BasicBlock's destructor takes care of those. 300a6399ae08967109b1427b34b5bde775a38bb4d75Dan Gohman while (!BasicBlocks.empty()) 301a6399ae08967109b1427b34b5bde775a38bb4d75Dan Gohman BasicBlocks.begin()->eraseFromParent(); 3021e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne 3031e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne // Prefix data is stored in a side table. 304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines setPrefixData(nullptr); 305009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 30670cc3397f84c2e1fd69c059a0ef89e398e847b00Chris Lattner 30770d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendlingvoid Function::addAttribute(unsigned i, Attribute::AttrKind attr) { 30899faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling AttributeSet PAL = getAttributes(); 30970d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling PAL = PAL.addAttribute(getContext(), i, attr); 31070d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling setAttributes(PAL); 31170d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling} 31270d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling 31370d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendlingvoid Function::addAttributes(unsigned i, AttributeSet attrs) { 31470d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling AttributeSet PAL = getAttributes(); 31570d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling PAL = PAL.addAttributes(getContext(), i, attrs); 3160598866c052147c31b808391f58434ce3dbfb838Devang Patel setAttributes(PAL); 31792432a8db1266f7932bce13a7e6354b0993838d3Duncan Sands} 31892432a8db1266f7932bce13a7e6354b0993838d3Duncan Sands 3198246df61f6de716acf1f8c64fac3c19970a2c174Bill Wendlingvoid Function::removeAttributes(unsigned i, AttributeSet attrs) { 32099faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling AttributeSet PAL = getAttributes(); 3218246df61f6de716acf1f8c64fac3c19970a2c174Bill Wendling PAL = PAL.removeAttributes(getContext(), i, attrs); 3220598866c052147c31b808391f58434ce3dbfb838Devang Patel setAttributes(PAL); 3230bf7b414ae0bb6699cadc3a210d18cfec44e9354Eric Christopher} 3240bf7b414ae0bb6699cadc3a210d18cfec44e9354Eric Christopher 3255eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen// Maintain the GC name for each function in an on-the-side table. This saves 3265eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen// allocating an additional word in Function for programs which do not use GC 3275eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen// (i.e., most programs) at the cost of increased overhead for clients which do 3285eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen// use GC. 329bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Andersonstatic DenseMap<const Function*,PooledStringPtr> *GCNames; 330bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Andersonstatic StringPool *GCNamePool; 331b2c0fe4d93ba75b8343de60984b0ce3548cd22c9Owen Andersonstatic ManagedStatic<sys::SmartRWMutex<true> > GCLock; 33280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 3335eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksenbool Function::hasGC() const { 334a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedReader<true> Reader(*GCLock); 335b2c0fe4d93ba75b8343de60984b0ce3548cd22c9Owen Anderson return GCNames && GCNames->count(this); 33680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 33780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 3385eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksenconst char *Function::getGC() const { 3395eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen assert(hasGC() && "Function has no collector"); 340a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedReader<true> Reader(*GCLock); 341b2c0fe4d93ba75b8343de60984b0ce3548cd22c9Owen Anderson return *(*GCNames)[this]; 34280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 34380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 3445eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksenvoid Function::setGC(const char *Str) { 345a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedWriter<true> Writer(*GCLock); 346bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson if (!GCNamePool) 347bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson GCNamePool = new StringPool(); 348bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson if (!GCNames) 349bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson GCNames = new DenseMap<const Function*,PooledStringPtr>(); 350bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson (*GCNames)[this] = GCNamePool->intern(Str); 35180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 35280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 3535eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksenvoid Function::clearGC() { 354a9d1f2c559ef4b2549e29288fe6944e68913ba0fOwen Anderson sys::SmartScopedWriter<true> Writer(*GCLock); 355bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson if (GCNames) { 3565eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCNames->erase(this); 357bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson if (GCNames->empty()) { 358bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson delete GCNames; 359dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines GCNames = nullptr; 360bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson if (GCNamePool->empty()) { 361bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson delete GCNamePool; 362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines GCNamePool = nullptr; 363bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson } 364bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson } 365bf5ec1b9db6f1f18b633908416b5798abd08981cOwen Anderson } 36680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 36780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 36828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to 36928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a Function) from the Function Src to this one. 37028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid Function::copyAttributesFrom(const GlobalValue *Src) { 37128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands assert(isa<Function>(Src) && "Expected a Function!"); 372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines GlobalObject::copyAttributesFrom(Src); 37328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands const Function *SrcF = cast<Function>(Src); 37428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands setCallingConv(SrcF->getCallingConv()); 3750598866c052147c31b808391f58434ce3dbfb838Devang Patel setAttributes(SrcF->getAttributes()); 3765eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (SrcF->hasGC()) 3775eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen setGC(SrcF->getGC()); 3785eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen else 3795eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen clearGC(); 3801e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne if (SrcF->hasPrefixData()) 3811e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne setPrefixData(SrcF->getPrefixData()); 3821e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne else 383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines setPrefixData(nullptr); 38428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands} 38528c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 386dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner/// getIntrinsicID - This method returns the ID number of the specified 387d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke/// function, or Intrinsic::not_intrinsic if the function is not an 3886b63452c3ad26678b32f93dbca55902a313ee4e9Misha Brukman/// intrinsic, or if the pointer is null. This value is always defined to be 389dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner/// zero to allow easy checking for whether a function is intrinsic or not. The 390dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner/// particular intrinsic functions which correspond to this value are defined in 3914c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman/// llvm/Intrinsics.h. Results are cached in the LLVM context, subsequent 3924c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman/// requests for the same ID return results much faster from the cache. 393dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner/// 39449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesenunsigned Function::getIntrinsicID() const { 3953b515802f652b16b05c9a8f344d219a0739b36a3Chris Lattner const ValueName *ValName = this->getValueName(); 396f846f16c92590379e900d01812e828e83b759ceeMichael Ilseman if (!ValName || !isIntrinsic()) 397085659f040f8b943c931db8a695dec4bf22578a5Reid Spencer return 0; 3984c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman 3994c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman LLVMContextImpl::IntrinsicIDCacheTy &IntrinsicIDCache = 4004c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman getContext().pImpl->IntrinsicIDCache; 4011ac186e009af8496df3ecd2c5ad4918d5c53a0a3Chris Lattner if (!IntrinsicIDCache.count(this)) { 4024c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman unsigned Id = lookupIntrinsicID(); 4034c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman IntrinsicIDCache[this]=Id; 4044c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman return Id; 4054c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman } 4064c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman return IntrinsicIDCache[this]; 4074c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman} 4084c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman 4094c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman/// This private method does the actual lookup of an intrinsic ID when the query 4104c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman/// could not be answered from the cache. 4114c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilsemanunsigned Function::lookupIntrinsicID() const { 4124c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman const ValueName *ValName = this->getValueName(); 4133b515802f652b16b05c9a8f344d219a0739b36a3Chris Lattner unsigned Len = ValName->getKeyLength(); 4143b515802f652b16b05c9a8f344d219a0739b36a3Chris Lattner const char *Name = ValName->getKeyData(); 4150f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 4169a016ff284f7301da20e74fb1304fb17e3d1214dChris Lattner#define GET_FUNCTION_RECOGNIZER 417351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 4189a016ff284f7301da20e74fb1304fb17e3d1214dChris Lattner#undef GET_FUNCTION_RECOGNIZER 4194c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman 420dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner return 0; 421dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner} 422dd035d188a80f560ff4193391a9e8df64c993369Chris Lattner 423eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramerstd::string Intrinsic::getName(ID id, ArrayRef<Type*> Tys) { 424b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner assert(id < num_intrinsics && "Invalid intrinsic ID!"); 425607b8ebfb849e3257d5ab64fae3ae62229eadb6fChris Lattner static const char * const Table[] = { 426b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner "not_intrinsic", 427b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner#define GET_INTRINSIC_NAME_TABLE 428351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 429b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner#undef GET_INTRINSIC_NAME_TABLE 430b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner }; 431eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer if (Tys.empty()) 4321437a0976567810c2930218b1ba582820150b05cReid Spencer return Table[id]; 4331437a0976567810c2930218b1ba582820150b05cReid Spencer std::string Result(Table[id]); 434eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer for (unsigned i = 0; i < Tys.size(); ++i) { 435db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner if (PointerType* PTyp = dyn_cast<PointerType>(Tys[i])) { 4360f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman Result += ".p" + llvm::utostr(PTyp->getAddressSpace()) + 437e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT::getEVT(PTyp->getElementType()).getEVTString(); 438e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang } 439e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang else if (Tys[i]) 440e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson Result += "." + EVT::getEVT(Tys[i]).getEVTString(); 441e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang } 4421437a0976567810c2930218b1ba582820150b05cReid Spencer return Result; 443b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner} 444b847423fc6653bc1fd0d1dde4f968502985d2c6aChris Lattner 445a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner 446908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner/// IIT_Info - These are enumerators that describe the entries returned by the 447908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner/// getIntrinsicInfoTableEntries function. 448908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner/// 449908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner/// NOTE: This must be kept in synch with the copy in TblGen/IntrinsicEmitter! 450908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattnerenum IIT_Info { 451908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner // Common values should be encoded with 0-15. 452908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_Done = 0, 453908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_I1 = 1, 454908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_I8 = 2, 455908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_I16 = 3, 456908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_I32 = 4, 457908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_I64 = 5, 4584d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_F16 = 6, 4594d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_F32 = 7, 4604d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_F64 = 8, 4614d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_V2 = 9, 4624d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_V4 = 10, 4634d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_V8 = 11, 4644d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_V16 = 12, 4654d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_V32 = 13, 466908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_PTR = 14, 467908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IIT_ARG = 15, 4680f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 469908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner // Values from 16+ are only encodable with the inefficient encoding. 4704d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_MMX = 16, 4714d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_METADATA = 17, 4724d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_EMPTYSTRUCT = 18, 4734d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_STRUCT2 = 19, 4744d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_STRUCT3 = 20, 4754d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_STRUCT4 = 21, 4764d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman IIT_STRUCT5 = 22, 47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IIT_EXTEND_ARG = 23, 47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IIT_TRUNC_ARG = 24, 479477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu IIT_ANYPTR = 25, 4802e50b8a08d40ce72ae35c73528140d3ee25209e0Andrew Trick IIT_V1 = 26, 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IIT_VARARG = 27, 48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IIT_HALF_VEC_ARG = 28 483908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner}; 484908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 485908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 486908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattnerstatic void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, 487908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner SmallVectorImpl<Intrinsic::IITDescriptor> &OutputTable) { 488626b108619ec72267ff7b89d325ccf808fee88b6Chris Lattner IIT_Info Info = IIT_Info(Infos[NextElt++]); 489d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner unsigned StructElts = 2; 490908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner using namespace Intrinsic; 4910f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 492626b108619ec72267ff7b89d325ccf808fee88b6Chris Lattner switch (Info) { 493908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_Done: 494908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Void, 0)); 495908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 4962e50b8a08d40ce72ae35c73528140d3ee25209e0Andrew Trick case IIT_VARARG: 4972e50b8a08d40ce72ae35c73528140d3ee25209e0Andrew Trick OutputTable.push_back(IITDescriptor::get(IITDescriptor::VarArg, 0)); 4982e50b8a08d40ce72ae35c73528140d3ee25209e0Andrew Trick return; 499908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_MMX: 500908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::MMX, 0)); 501908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 502908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_METADATA: 503908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Metadata, 0)); 504908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 5054d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman case IIT_F16: 5064d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman OutputTable.push_back(IITDescriptor::get(IITDescriptor::Half, 0)); 5074d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman return; 508908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_F32: 509908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Float, 0)); 510908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 511908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_F64: 512908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Double, 0)); 513908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 514908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_I1: 515908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 1)); 516908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 517908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_I8: 518908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 8)); 519908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 520908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_I16: 521908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer,16)); 522908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 523908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_I32: 524908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 32)); 525908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 526908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_I64: 527908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 64)); 528908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 529477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu case IIT_V1: 530477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 1)); 531477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu DecodeIITType(NextElt, Infos, OutputTable); 532477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu return; 53346aaf69e37287a9696b6cc5c49d10d0937ff052bChris Lattner case IIT_V2: 534908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 2)); 535908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 536908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 53746aaf69e37287a9696b6cc5c49d10d0937ff052bChris Lattner case IIT_V4: 538908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 4)); 539908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 540908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 54146aaf69e37287a9696b6cc5c49d10d0937ff052bChris Lattner case IIT_V8: 542908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 8)); 543908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 544908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 54546aaf69e37287a9696b6cc5c49d10d0937ff052bChris Lattner case IIT_V16: 546908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 16)); 547908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 548908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 549d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner case IIT_V32: 550908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 32)); 551908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 552908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 553a48289a672e20587e95bcdd84d5c71d28eb3d2b8Chris Lattner case IIT_PTR: 554908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 0)); 555908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 556908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 557a48289a672e20587e95bcdd84d5c71d28eb3d2b8Chris Lattner case IIT_ANYPTR: { // [ANYPTR addrspace, subtype] 5580f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 559908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Infos[NextElt++])); 560908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 561908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 562908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 563908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_ARG: { 564908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 565908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Argument, ArgInfo)); 566908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 567908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 56836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case IIT_EXTEND_ARG: { 569908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 57036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OutputTable.push_back(IITDescriptor::get(IITDescriptor::ExtendArgument, 571908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArgInfo)); 572908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 573b428511989eea383b4fa65678c12b055d5c72af5Pete Cooper } 57436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case IIT_TRUNC_ARG: { 575908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OutputTable.push_back(IITDescriptor::get(IITDescriptor::TruncArgument, 57736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArgInfo)); 57836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return; 57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case IIT_HALF_VEC_ARG: { 58136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 58236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OutputTable.push_back(IITDescriptor::get(IITDescriptor::HalfVecArgument, 583908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArgInfo)); 584908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 585d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner } 586908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IIT_EMPTYSTRUCT: 587908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0)); 588908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 589d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner case IIT_STRUCT5: ++StructElts; // FALL THROUGH. 590d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner case IIT_STRUCT4: ++StructElts; // FALL THROUGH. 591d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner case IIT_STRUCT3: ++StructElts; // FALL THROUGH. 592d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner case IIT_STRUCT2: { 593908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct,StructElts)); 594908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 595d7cf5eb0219db7303875941ab62b3ef6e8fb0b31Chris Lattner for (unsigned i = 0; i != StructElts; ++i) 596908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, Infos, OutputTable); 597908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return; 59846aaf69e37287a9696b6cc5c49d10d0937ff052bChris Lattner } 599a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner } 600a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner llvm_unreachable("unhandled"); 601a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner} 602a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner 603908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 604908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner#define GET_INTRINSIC_GENERATOR_GLOBAL 605351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 606908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner#undef GET_INTRINSIC_GENERATOR_GLOBAL 607908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 6080f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilsemanvoid Intrinsic::getIntrinsicInfoTableEntries(ID id, 609908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner SmallVectorImpl<IITDescriptor> &T){ 610a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner // Check to see if the intrinsic's type was expressible by the table. 611a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner unsigned TableVal = IIT_Table[id-1]; 6120f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 613387c9dcddabe8551468647b249d3629953caab9eChris Lattner // Decode the TableVal into an array of IITValues. 614387c9dcddabe8551468647b249d3629953caab9eChris Lattner SmallVector<unsigned char, 8> IITValues; 615387c9dcddabe8551468647b249d3629953caab9eChris Lattner ArrayRef<unsigned char> IITEntries; 616387c9dcddabe8551468647b249d3629953caab9eChris Lattner unsigned NextElt = 0; 617387c9dcddabe8551468647b249d3629953caab9eChris Lattner if ((TableVal >> 31) != 0) { 618387c9dcddabe8551468647b249d3629953caab9eChris Lattner // This is an offset into the IIT_LongEncodingTable. 619387c9dcddabe8551468647b249d3629953caab9eChris Lattner IITEntries = IIT_LongEncodingTable; 6200f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 621387c9dcddabe8551468647b249d3629953caab9eChris Lattner // Strip sentinel bit. 622387c9dcddabe8551468647b249d3629953caab9eChris Lattner NextElt = (TableVal << 1) >> 1; 623387c9dcddabe8551468647b249d3629953caab9eChris Lattner } else { 624908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner // Decode the TableVal into an array of IITValues. If the entry was encoded 625908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner // into a single word in the table itself, decode it now. 626626b108619ec72267ff7b89d325ccf808fee88b6Chris Lattner do { 627626b108619ec72267ff7b89d325ccf808fee88b6Chris Lattner IITValues.push_back(TableVal & 0xF); 628626b108619ec72267ff7b89d325ccf808fee88b6Chris Lattner TableVal >>= 4; 629626b108619ec72267ff7b89d325ccf808fee88b6Chris Lattner } while (TableVal); 6300f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 631387c9dcddabe8551468647b249d3629953caab9eChris Lattner IITEntries = IITValues; 632387c9dcddabe8551468647b249d3629953caab9eChris Lattner NextElt = 0; 633a98aa6ad1e8e53600b2e322e2ab869e03d436849Chris Lattner } 634908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 635908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner // Okay, decode the table into the output vector of IITDescriptors. 636908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, IITEntries, T); 637908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner while (NextElt != IITEntries.size() && IITEntries[NextElt] != 0) 638908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner DecodeIITType(NextElt, IITEntries, T); 639908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner} 640908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 641908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 642908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattnerstatic Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, 643908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArrayRef<Type*> Tys, LLVMContext &Context) { 644908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner using namespace Intrinsic; 645908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IITDescriptor D = Infos.front(); 646908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Infos = Infos.slice(1); 6470f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 648908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner switch (D.Kind) { 649908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Void: return Type::getVoidTy(Context); 6502e50b8a08d40ce72ae35c73528140d3ee25209e0Andrew Trick case IITDescriptor::VarArg: return Type::getVoidTy(Context); 651908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::MMX: return Type::getX86_MMXTy(Context); 652908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Metadata: return Type::getMetadataTy(Context); 6534d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman case IITDescriptor::Half: return Type::getHalfTy(Context); 654908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Float: return Type::getFloatTy(Context); 655908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Double: return Type::getDoubleTy(Context); 6560f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 657908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Integer: 658908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return IntegerType::get(Context, D.Integer_Width); 659908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Vector: 660908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return VectorType::get(DecodeFixedType(Infos, Tys, Context),D.Vector_Width); 661908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Pointer: 662908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return PointerType::get(DecodeFixedType(Infos, Tys, Context), 663908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner D.Pointer_AddressSpace); 664908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Struct: { 665908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Type *Elts[5]; 666908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner assert(D.Struct_NumElements <= 5 && "Can't handle this yet"); 667908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i) 668908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Elts[i] = DecodeFixedType(Infos, Tys, Context); 669908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return StructType::get(Context, ArrayRef<Type*>(Elts,D.Struct_NumElements)); 670908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 671908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 672908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner case IITDescriptor::Argument: 673908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return Tys[D.getArgumentNumber()]; 67436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case IITDescriptor::ExtendArgument: { 67536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *Ty = Tys[D.getArgumentNumber()]; 67636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (VectorType *VTy = dyn_cast<VectorType>(Ty)) 67736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return VectorType::getExtendedElementVectorType(VTy); 6780f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return IntegerType::get(Context, 2 * cast<IntegerType>(Ty)->getBitWidth()); 68036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 68136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case IITDescriptor::TruncArgument: { 68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Type *Ty = Tys[D.getArgumentNumber()]; 68336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (VectorType *VTy = dyn_cast<VectorType>(Ty)) 68436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return VectorType::getTruncatedElementVectorType(VTy); 68536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 68636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IntegerType *ITy = cast<IntegerType>(Ty); 68736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(ITy->getBitWidth() % 2 == 0); 68836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return IntegerType::get(Context, ITy->getBitWidth() / 2); 68936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 69036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case IITDescriptor::HalfVecArgument: 69136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return VectorType::getHalfElementsVectorType(cast<VectorType>( 692908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Tys[D.getArgumentNumber()])); 693908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 694908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner llvm_unreachable("unhandled"); 695908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner} 696908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 697908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 698908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 699908a831a9a1fb043bc4758d6712d78255099ae51Chris LattnerFunctionType *Intrinsic::getType(LLVMContext &Context, 700908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ID id, ArrayRef<Type*> Tys) { 701908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner SmallVector<IITDescriptor, 8> Table; 702908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner getIntrinsicInfoTableEntries(id, Table); 7030f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 704908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArrayRef<IITDescriptor> TableRef = Table; 705908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Type *ResultTy = DecodeFixedType(TableRef, Tys, Context); 7060f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman 707387c9dcddabe8551468647b249d3629953caab9eChris Lattner SmallVector<Type*, 8> ArgTys; 708908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner while (!TableRef.empty()) 709908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArgTys.push_back(DecodeFixedType(TableRef, Tys, Context)); 71095af592a631f403e1458ec1155f89fc31011572cJim Laskey 7110f47e7e01928a4e16f773dc4db14a800d148bfc8Michael Ilseman return FunctionType::get(ResultTy, ArgTys, false); 71295af592a631f403e1458ec1155f89fc31011572cJim Laskey} 71395af592a631f403e1458ec1155f89fc31011572cJim Laskey 7140d52ff1f7b993750a74a5d4432273092de9af069Mon P Wangbool Intrinsic::isOverloaded(ID id) { 7150d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang#define GET_INTRINSIC_OVERLOAD_TABLE 716351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 7170d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang#undef GET_INTRINSIC_OVERLOAD_TABLE 7180d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang} 7190d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang 720048ffb239c282277959463c61200b86e2380cb84Chris Lattner/// This defines the "Intrinsic::getAttributes(ID id)" method. 721a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands#define GET_INTRINSIC_ATTRIBUTES 722351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 723a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands#undef GET_INTRINSIC_ATTRIBUTES 724a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands 725eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin KramerFunction *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys) { 726a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands // There can never be multiple globals with the same name of different types, 727a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands // because intrinsics must be a specific type. 72879ab3e801480e6412c064a3fb15a79a8cab13efcDuncan Sands return 729eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer cast<Function>(M->getOrInsertFunction(getName(id, Tys), 730eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer getType(M->getContext(), id, Tys))); 73195af592a631f403e1458ec1155f89fc31011572cJim Laskey} 73295af592a631f403e1458ec1155f89fc31011572cJim Laskey 73349de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen// This defines the "Intrinsic::getIntrinsicForGCCBuiltin()" method. 73449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN 735351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 73649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN 73749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen 738cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// This defines the "Intrinsic::getIntrinsicForMSBuiltin()" method. 739cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN 740cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/IR/Intrinsics.gen" 741cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN 742cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 7430054c7a867f85f52fdcc11279d696160de92c9f8Gabor Greif/// hasAddressTaken - returns true if there are any uses of this function 7440054c7a867f85f52fdcc11279d696160de92c9f8Gabor Greif/// other than direct calls or invokes to it. 745c9f7500d1752feac7cece26d20007a99d21f677cGabor Greifbool Function::hasAddressTaken(const User* *PutOffender) const { 74636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (const Use &U : uses()) { 74736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const User *FU = U.getUser(); 74836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (isa<BlockAddress>(FU)) 749b7454fd9df0b477e3daf2fce6e1d5e1b241562dfJay Foad continue; 75036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isa<CallInst>(FU) && !isa<InvokeInst>(FU)) 75136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return PutOffender ? (*PutOffender = FU, true) : true; 75236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ImmutableCallSite CS(cast<Instruction>(FU)); 75336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CS.isCallee(&U)) 75436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return PutOffender ? (*PutOffender = FU, true) : true; 755757068f3bad425fb126fe16ab7b8a82a636e6bbdJay Foad } 756757068f3bad425fb126fe16ab7b8a82a636e6bbdJay Foad return false; 757757068f3bad425fb126fe16ab7b8a82a636e6bbdJay Foad} 758757068f3bad425fb126fe16ab7b8a82a636e6bbdJay Foad 759c66330504c3f433430a28cd7f7f981e555c51bceEli Friedmanbool Function::isDefTriviallyDead() const { 760c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman // Check the linkage 761c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman if (!hasLinkOnceLinkage() && !hasLocalLinkage() && 762c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman !hasAvailableExternallyLinkage()) 763c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman return false; 764c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman 765c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman // Check if the function is used by anything other than a blockaddress. 76636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (const User *U : users()) 76736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isa<BlockAddress>(U)) 768c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman return false; 769c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman 770c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman return true; 771c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman} 772c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman 7733c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling/// callsFunctionThatReturnsTwice - Return true if the function has a call to 7743c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling/// setjmp or other function that gcc recognizes as "returning twice". 7753c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendlingbool Function::callsFunctionThatReturnsTwice() const { 7763c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling for (const_inst_iterator 7773c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling I = inst_begin(this), E = inst_end(this); I != E; ++I) { 77836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ImmutableCallSite CS(&*I); 77936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (CS && CS.hasFnAttr(Attribute::ReturnsTwice)) 7803c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling return true; 7813c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling } 7823c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling 7833c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling return false; 7843c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling} 7851e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne 7861e3037f0be430ef2339838bbdede11f45658bd82Peter CollingbourneConstant *Function::getPrefixData() const { 7871e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne assert(hasPrefixData()); 7881e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne const LLVMContextImpl::PrefixDataMapTy &PDMap = 7891e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne getContext().pImpl->PrefixDataMap; 7901e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne assert(PDMap.find(this) != PDMap.end()); 7911e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne return cast<Constant>(PDMap.find(this)->second->getReturnValue()); 7921e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne} 7931e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne 7941e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbournevoid Function::setPrefixData(Constant *PrefixData) { 7951e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne if (!PrefixData && !hasPrefixData()) 7961e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne return; 7971e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne 7981e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne unsigned SCData = getSubclassDataFromValue(); 7991e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne LLVMContextImpl::PrefixDataMapTy &PDMap = getContext().pImpl->PrefixDataMap; 8001e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne ReturnInst *&PDHolder = PDMap[this]; 8011e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne if (PrefixData) { 8021e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne if (PDHolder) 8031e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne PDHolder->setOperand(0, PrefixData); 8041e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne else 8051e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne PDHolder = ReturnInst::Create(getContext(), PrefixData); 8061e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne SCData |= 2; 8071e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne } else { 8081e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne delete PDHolder; 8091e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne PDMap.erase(this); 8101e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne SCData &= ~2; 8111e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne } 8121e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne setValueSubclassData(SCData); 8131e3037f0be430ef2339838bbdede11f45658bd82Peter Collingbourne} 814