MemoryBuiltins.cpp revision 42e72ca3d00dbe073fbb39e181caa7f0c4c171b7
1f006b183e2d2bebcf6968d1dd7350397c95b0325Victor Hernandez//===------ MemoryBuiltins.cpp - Identify calls to memory builtins --------===// 2fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// 3fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// The LLVM Compiler Infrastructure 4fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// 5fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// This file is distributed under the University of Illinois Open Source 6fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// License. See LICENSE.TXT for details. 7fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// 8fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng//===----------------------------------------------------------------------===// 9fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// 10f006b183e2d2bebcf6968d1dd7350397c95b0325Victor Hernandez// This family of functions identifies calls to builtin functions that allocate 11f006b183e2d2bebcf6968d1dd7350397c95b0325Victor Hernandez// or free memory. 12fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// 13fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng//===----------------------------------------------------------------------===// 14fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 15f006b183e2d2bebcf6968d1dd7350397c95b0325Victor Hernandez#include "llvm/Analysis/MemoryBuiltins.h" 16fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng#include "llvm/Constants.h" 17fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng#include "llvm/Instructions.h" 18fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng#include "llvm/Module.h" 198e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez#include "llvm/Analysis/ValueTracking.h" 209d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez#include "llvm/Target/TargetData.h" 21fabcb9127f278a77b8aae5673be1115390c55050Evan Chengusing namespace llvm; 22fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 23fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng//===----------------------------------------------------------------------===// 24fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// malloc Call Utility Functions. 25fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng// 26fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 27f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// isMalloc - Returns true if the value is either a malloc call or a 28fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// bitcast of the result of a malloc call. 2988efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandezbool llvm::isMalloc(const Value *I) { 30fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return extractMallocCall(I) || extractMallocCallFromBitCast(I); 31fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 32fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 33fabcb9127f278a77b8aae5673be1115390c55050Evan Chengstatic bool isMallocCall(const CallInst *CI) { 34fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng if (!CI) 35fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return false; 36fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 373ad70d5d61f3f86fb5bc167e157680fc107a1173Victor Hernandez Function *Callee = CI->getCalledFunction(); 3842e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky if (Callee == 0 || !Callee->isDeclaration()) 3942e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky return false; 4042e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky if (Callee->getName() != "malloc" && 4142e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky Callee->getName() != "_Znwj" && Callee->getName() != "_Znwm" && 4242e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky Callee->getName() != "_Znaj" && Callee->getName() != "_Znam") 43fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return false; 44fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 4585c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin // Check malloc prototype. 464de86fe0d7e19f1156d37292211536258044fe5aTorok Edwin // FIXME: workaround for PR5130, this will be obsolete when a nobuiltin 474de86fe0d7e19f1156d37292211536258044fe5aTorok Edwin // attribute will exist. 483ad70d5d61f3f86fb5bc167e157680fc107a1173Victor Hernandez const FunctionType *FTy = Callee->getFunctionType(); 4985c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin if (FTy->getNumParams() != 1) 5085c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin return false; 5185c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin if (IntegerType *ITy = dyn_cast<IntegerType>(FTy->param_begin()->get())) { 5285c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin if (ITy->getBitWidth() != 32 && ITy->getBitWidth() != 64) 5385c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin return false; 5485c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin return true; 5585c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin } 5685c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin 5785c005af0d63c484114ce88258aecb8e1c8c2fa2Torok Edwin return false; 58fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 59fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 60fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// extractMallocCall - Returns the corresponding CallInst if the instruction 61fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// is a malloc call. Since CallInst::CreateMalloc() only creates calls, we 62fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// ignore InvokeInst here. 6388efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandezconst CallInst *llvm::extractMallocCall(const Value *I) { 64fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng const CallInst *CI = dyn_cast<CallInst>(I); 65fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return (isMallocCall(CI)) ? CI : NULL; 66fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 67fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 6888efeaee227a069b3ec3d1b69c918ef31da78a23Victor HernandezCallInst *llvm::extractMallocCall(Value *I) { 69fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng CallInst *CI = dyn_cast<CallInst>(I); 70fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return (isMallocCall(CI)) ? CI : NULL; 71fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 72fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 7388efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandezstatic bool isBitCastOfMallocCall(const BitCastInst *BCI) { 74fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng if (!BCI) 75fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return false; 76fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 77fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return isMallocCall(dyn_cast<CallInst>(BCI->getOperand(0))); 78fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 79fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 80fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// extractMallocCallFromBitCast - Returns the corresponding CallInst if the 81fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// instruction is a bitcast of the result of a malloc call. 8288efeaee227a069b3ec3d1b69c918ef31da78a23Victor HernandezCallInst *llvm::extractMallocCallFromBitCast(Value *I) { 83fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng BitCastInst *BCI = dyn_cast<BitCastInst>(I); 84399e45b459c2904b9bd1927306670585ecec3378Victor Hernandez return (isBitCastOfMallocCall(BCI)) ? cast<CallInst>(BCI->getOperand(0)) 85399e45b459c2904b9bd1927306670585ecec3378Victor Hernandez : NULL; 86fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 87fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 8888efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandezconst CallInst *llvm::extractMallocCallFromBitCast(const Value *I) { 89fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng const BitCastInst *BCI = dyn_cast<BitCastInst>(I); 90399e45b459c2904b9bd1927306670585ecec3378Victor Hernandez return (isBitCastOfMallocCall(BCI)) ? cast<CallInst>(BCI->getOperand(0)) 91399e45b459c2904b9bd1927306670585ecec3378Victor Hernandez : NULL; 92fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 93fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 948e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandezstatic Value *computeArraySize(const CallInst *CI, const TargetData *TD, 958e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez bool LookThroughSExt = false) { 96fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng if (!CI) 9790f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez return NULL; 98fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 999d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez // The size of the malloc's result type must be known to determine array size. 10088efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandez const Type *T = getMallocAllocatedType(CI); 1019d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez if (!T || !T->isSized() || !TD) 10290f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez return NULL; 103fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 1048e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez unsigned ElementSize = TD->getTypeAllocSize(T); 1059d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez if (const StructType *ST = dyn_cast<StructType>(T)) 1068e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez ElementSize = TD->getStructLayout(ST)->getSizeInBytes(); 1079d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez 108e3401c4fae95bc69dada2a3f9080d9f15349af61Gabor Greif // If malloc call's arg can be determined to be a multiple of ElementSize, 1098e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez // return the multiple. Otherwise, return NULL. 110e3401c4fae95bc69dada2a3f9080d9f15349af61Gabor Greif Value *MallocArg = CI->getArgOperand(0); 1118e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez Value *Multiple = NULL; 1128e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez if (ComputeMultiple(MallocArg, ElementSize, Multiple, 1133dbb9e64d6e9d1e8bf16f75ebe4fe59ffdf93dd3Dan Gohman LookThroughSExt)) 1148e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez return Multiple; 11588d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez 11690f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez return NULL; 117fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 118fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 119fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// isArrayMalloc - Returns the corresponding CallInst if the instruction 12090f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez/// is a call to malloc whose array size can be determined and the array size 12190f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez/// is not constant 1. Otherwise, return NULL. 1227b550ccfc5a3346c17e0390a59e2d6d19bc52705Chris Lattnerconst CallInst *llvm::isArrayMalloc(const Value *I, const TargetData *TD) { 123fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng const CallInst *CI = extractMallocCall(I); 1248e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez Value *ArraySize = computeArraySize(CI, TD); 12590f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez 12690f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez if (ArraySize && 127e3401c4fae95bc69dada2a3f9080d9f15349af61Gabor Greif ArraySize != ConstantInt::get(CI->getArgOperand(0)->getType(), 1)) 12890f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez return CI; 12990f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez 13090f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez // CI is a non-array malloc or we can't figure out that it is an array malloc. 13190f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez return NULL; 132fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 133fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 134fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng/// getMallocType - Returns the PointerType resulting from the malloc call. 1359d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// The PointerType depends on the number of bitcast uses of the malloc call: 1369d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// 0: PointerType is the calls' return type. 1379d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// 1: PointerType is the bitcast's result type. 1389d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// >1: Unique PointerType cannot be determined, return NULL. 13988efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandezconst PointerType *llvm::getMallocType(const CallInst *CI) { 1408e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez assert(isMalloc(CI) && "getMallocType and not malloc call"); 141fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 1429d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez const PointerType *MallocType = NULL; 1439d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez unsigned NumOfBitCastUses = 0; 1449d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez 14588d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez // Determine if CallInst has a bitcast use. 14660ad781c61815ca5b8dc2a45a102e1c8af65992fGabor Greif for (Value::const_use_iterator UI = CI->use_begin(), E = CI->use_end(); 14788d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez UI != E; ) 1489d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez if (const BitCastInst *BCI = dyn_cast<BitCastInst>(*UI++)) { 1499d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez MallocType = cast<PointerType>(BCI->getDestTy()); 1509d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez NumOfBitCastUses++; 1519d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez } 15288d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez 1539d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez // Malloc call has 1 bitcast use, so type is the bitcast's destination type. 1549d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez if (NumOfBitCastUses == 1) 1559d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez return MallocType; 156fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 15760cfc03379c1ec3fac3dc807f5e93842c0b95f33Victor Hernandez // Malloc call was not bitcast, so type is the malloc function's return type. 1589d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez if (NumOfBitCastUses == 0) 15988d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez return cast<PointerType>(CI->getType()); 160fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 16188d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez // Type could not be determined. 16288d9839d07a6b5a03484d664913de0f2b33d3bffVictor Hernandez return NULL; 163fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 164fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 1659d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// getMallocAllocatedType - Returns the Type allocated by malloc call. 1669d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// The Type depends on the number of bitcast uses of the malloc call: 1679d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// 0: PointerType is the malloc calls' return type. 1689d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// 1: PointerType is the bitcast's result type. 1699d0b704e3ea418441001dac4d1a56c2c224cdbf5Victor Hernandez/// >1: Unique PointerType cannot be determined, return NULL. 17088efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandezconst Type *llvm::getMallocAllocatedType(const CallInst *CI) { 17188efeaee227a069b3ec3d1b69c918ef31da78a23Victor Hernandez const PointerType *PT = getMallocType(CI); 172fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng return PT ? PT->getElementType() : NULL; 173fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 174fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng 17590f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez/// getMallocArraySize - Returns the array size of a malloc call. If the 17690f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez/// argument passed to malloc is a multiple of the size of the malloced type, 17790f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez/// then return that multiple. For non-array mallocs, the multiple is 17890f48e7c91a8faa875ba889ca66b137ffd46e34aVictor Hernandez/// constant 1. Otherwise, return NULL for mallocs whose array size cannot be 1792491ce03535cf8ec171570d2e28df63e4db3dd6bVictor Hernandez/// determined. 1808e345a1c418608c49abb7c51a090bbb36f1273bcVictor HernandezValue *llvm::getMallocArraySize(CallInst *CI, const TargetData *TD, 1818e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez bool LookThroughSExt) { 1828e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez assert(isMalloc(CI) && "getMallocArraySize and not malloc call"); 1838e345a1c418608c49abb7c51a090bbb36f1273bcVictor Hernandez return computeArraySize(CI, TD, LookThroughSExt); 184fabcb9127f278a77b8aae5673be1115390c55050Evan Cheng} 18566284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez 186046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez//===----------------------------------------------------------------------===// 187046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez// free Call Utility Functions. 188046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez// 189046e78ce55a7c3d82b7b6758d2d77f2d99f970bfVictor Hernandez 19002680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif/// isFreeCall - Returns non-null if the value is a call to the builtin free() 19102680f946b8dcbeff3b8d7236030678551b15a6cGabor Greifconst CallInst *llvm::isFreeCall(const Value *I) { 19266284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez const CallInst *CI = dyn_cast<CallInst>(I); 19366284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez if (!CI) 19402680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif return 0; 1953ad70d5d61f3f86fb5bc167e157680fc107a1173Victor Hernandez Function *Callee = CI->getCalledFunction(); 19642e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky if (Callee == 0 || !Callee->isDeclaration()) 19742e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky return 0; 19842e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky 19942e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky if (Callee->getName() != "free" && 20042e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky Callee->getName() != "_Zdlj" && Callee->getName() != "_Zdlm" && 20142e72ca3d00dbe073fbb39e181caa7f0c4c171b7Nick Lewycky Callee->getName() != "_Zdaj" && Callee->getName() != "_Zdam") 20202680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif return 0; 20366284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez 20466284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez // Check free prototype. 20566284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez // FIXME: workaround for PR5130, this will be obsolete when a nobuiltin 20666284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez // attribute will exist. 2073ad70d5d61f3f86fb5bc167e157680fc107a1173Victor Hernandez const FunctionType *FTy = Callee->getFunctionType(); 2083ad70d5d61f3f86fb5bc167e157680fc107a1173Victor Hernandez if (!FTy->getReturnType()->isVoidTy()) 20902680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif return 0; 21066284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez if (FTy->getNumParams() != 1) 21102680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif return 0; 2123ad70d5d61f3f86fb5bc167e157680fc107a1173Victor Hernandez if (FTy->param_begin()->get() != Type::getInt8PtrTy(Callee->getContext())) 21302680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif return 0; 21466284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez 21502680f946b8dcbeff3b8d7236030678551b15a6cGabor Greif return CI; 21666284e063a1e46500acae48bdc0e4a00652021d1Victor Hernandez} 217