mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-14 13:57:51 +00:00
add EmitStrNLen()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160741 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
84315f03cb
commit
a536835230
@ -31,6 +31,12 @@ namespace llvm {
|
||||
Value *EmitStrLen(Value *Ptr, IRBuilder<> &B, const TargetData *TD,
|
||||
const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitStrNLen - Emit a call to the strnlen function to the builder, for the
|
||||
/// specified pointer. Ptr is required to be some pointer type, MaxLen must
|
||||
/// be of size_t type, and the return value has 'intptr_t' type.
|
||||
Value *EmitStrNLen(Value *Ptr, Value *MaxLen, IRBuilder<> &B,
|
||||
const TargetData *TD, const TargetLibraryInfo *TLI);
|
||||
|
||||
/// EmitStrChr - Emit a call to the strchr function to the builder, for the
|
||||
/// specified pointer and character. Ptr is required to be some pointer type,
|
||||
/// and the return value has 'i8*' type.
|
||||
|
@ -57,6 +57,33 @@ Value *llvm::EmitStrLen(Value *Ptr, IRBuilder<> &B, const TargetData *TD,
|
||||
return CI;
|
||||
}
|
||||
|
||||
/// EmitStrNLen - Emit a call to the strnlen function to the builder, for the
|
||||
/// specified pointer. Ptr is required to be some pointer type, MaxLen must
|
||||
/// be of size_t type, and the return value has 'intptr_t' type.
|
||||
Value *llvm::EmitStrNLen(Value *Ptr, Value *MaxLen, IRBuilder<> &B,
|
||||
const TargetData *TD, const TargetLibraryInfo *TLI) {
|
||||
if (!TLI->has(LibFunc::strnlen))
|
||||
return 0;
|
||||
|
||||
Module *M = B.GetInsertBlock()->getParent()->getParent();
|
||||
AttributeWithIndex AWI[2];
|
||||
AWI[0] = AttributeWithIndex::get(1, Attribute::NoCapture);
|
||||
AWI[1] = AttributeWithIndex::get(~0u, Attribute::ReadOnly |
|
||||
Attribute::NoUnwind);
|
||||
|
||||
LLVMContext &Context = B.GetInsertBlock()->getContext();
|
||||
Constant *StrNLen = M->getOrInsertFunction("strnlen", AttrListPtr::get(AWI),
|
||||
TD->getIntPtrType(Context),
|
||||
B.getInt8PtrTy(),
|
||||
TD->getIntPtrType(Context),
|
||||
NULL);
|
||||
CallInst *CI = B.CreateCall2(StrNLen, CastToCStr(Ptr, B), MaxLen, "strnlen");
|
||||
if (const Function *F = dyn_cast<Function>(StrNLen->stripPointerCasts()))
|
||||
CI->setCallingConv(F->getCallingConv());
|
||||
|
||||
return CI;
|
||||
}
|
||||
|
||||
/// EmitStrChr - Emit a call to the strchr function to the builder, for the
|
||||
/// specified pointer and character. Ptr is required to be some pointer type,
|
||||
/// and the return value has 'i8*' type.
|
||||
|
Loading…
x
Reference in New Issue
Block a user