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