[llvm-commits] [llvm] r160742 - in /llvm/trunk: include/llvm/Analysis/MemoryBuiltins.h lib/Analysis/MemoryBuiltins.cpp lib/Transforms/Instrumentation/BoundsChecking.cpp test/Instrumentation/BoundsChecking/strings.ll

Manman Ren mren at apple.com
Wed Jul 25 11:35:23 PDT 2012


This seems to break our bot:
/home/jabbey/tmp/buildbot/sandbox/clang-x86_64-ubuntu/clang-x86_64-ubuntu/llvm/Debug+Asserts/lib/libLLVMAnalysis.a(MemoryBuiltins.o): In function `llvm::ObjectSizeOffsetEvaluator::visitCallSite(llvm::CallSite)':
/home/jabbey/tmp/buildbot/sandbox/clang-x86_64-ubuntu/clang-x86_64-ubuntu/llvm/lib/Analysis/MemoryBuiltins.cpp:627: undefined reference to `llvm::EmitStrLen(llvm::Value*, llvm::IRBuilder<true, llvm::ConstantFolder, llvm::IRBuilderDefaultInserter<true> >&, llvm::TargetData const*, llvm::TargetLibraryInfo const*)'
/home/jabbey/tmp/buildbot/sandbox/clang-x86_64-ubuntu/clang-x86_64-ubuntu/llvm/lib/Analysis/MemoryBuiltins.cpp:631: undefined reference to `llvm::EmitStrNLen(llvm::Value*, llvm::Value*, llvm::IRBuilder<true, llvm::ConstantFolder, llvm::IRBuilderDefaultInserter<true> >&, llvm::TargetData const*, llvm::TargetLibraryInfo const*)'
collect2: ld returned 1 exit status
make[2]: *** [/home/jabbey/tmp/buildbot/sandbox/clang-x86_64-ubuntu/clang-x86_64-ubuntu/llvm/Debug+Asserts/bin/llvm-link] Error 1
make[2]: Leaving directory `/home/jabbey/tmp/buildbot/sandbox/clang-x86_64-ubuntu/clang-x86_64-ubuntu/llvm/tools/llvm-link'
make[1]: *** [llvm-link/.makeall] Error 2
make[1]: *** Waiting for unfinished jobs....

Thanks,
Manman

On Jul 25, 2012, at 10:29 AM, Nuno Lopes wrote:

> Author: nlopes
> Date: Wed Jul 25 12:29:22 2012
> New Revision: 160742
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=160742&view=rev
> Log:
> MemoryBuiltins: add support to determine the size of strdup'ed non-constant strings
> 
> Added:
>    llvm/trunk/test/Instrumentation/BoundsChecking/strings.ll
> Modified:
>    llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h
>    llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
>    llvm/trunk/lib/Transforms/Instrumentation/BoundsChecking.cpp
> 
> Modified: llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h?rev=160742&r1=160741&r2=160742&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h (original)
> +++ llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h Wed Jul 25 12:29:22 2012
> @@ -201,6 +201,7 @@
>   typedef SmallPtrSet<const Value*, 8> PtrSetTy;
> 
>   const TargetData *TD;
> +  const TargetLibraryInfo *TLI;
>   LLVMContext &Context;
>   BuilderTy Builder;
>   ObjectSizeOffsetVisitor Visitor;
> @@ -215,7 +216,8 @@
>   SizeOffsetEvalType compute_(Value *V);
> 
> public:
> -  ObjectSizeOffsetEvaluator(const TargetData *TD, LLVMContext &Context);
> +  ObjectSizeOffsetEvaluator(const TargetData *TD, const TargetLibraryInfo *TLI,
> +                            LLVMContext &Context);
>   SizeOffsetEvalType compute(Value *V);
> 
>   bool knownSize(SizeOffsetEvalType SizeOffset) {
> 
> Modified: llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryBuiltins.cpp?rev=160742&r1=160741&r2=160742&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/MemoryBuiltins.cpp (original)
> +++ llvm/trunk/lib/Analysis/MemoryBuiltins.cpp Wed Jul 25 12:29:22 2012
> @@ -26,6 +26,7 @@
> #include "llvm/Support/MathExtras.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/Target/TargetData.h"
> +#include "llvm/Transforms/Utils/BuildLibCalls.h"
> #include "llvm/Transforms/Utils/Local.h"
> using namespace llvm;
> 
> @@ -448,11 +449,9 @@
>   return std::make_pair(Size, Zero);
> 
>   // TODO: handle more standard functions (+ wchar cousins):
> -  // - strdup / strndup
>   // - strcpy / strncpy
>   // - strcat / strncat
>   // - memcpy / memmove
> -  // - strcat / strncat
>   // - memset
> }
> 
> @@ -524,8 +523,9 @@
> 
> 
> ObjectSizeOffsetEvaluator::ObjectSizeOffsetEvaluator(const TargetData *TD,
> +                                                     const TargetLibraryInfo *TLI,
>                                                      LLVMContext &Context)
> -: TD(TD), Context(Context), Builder(Context, TargetFolder(TD)),
> +: TD(TD), TLI(TLI), Context(Context), Builder(Context, TargetFolder(TD)),
> Visitor(TD, Context) {
>   IntTy = TD->getIntPtrType(Context);
>   Zero = ConstantInt::get(IntTy, 0);
> @@ -619,8 +619,21 @@
> 
>   // handle strdup-like functions separately
>   if (FnData->AllocTy == StrDupLike) {
> -    // TODO
> -    return unknown();
> +    IRBuilder<> StdBuilder(Builder.GetInsertPoint());
> +    Value *Size;
> +
> +    // strdup(str): size =  strlen(str)+1
> +    if (FnData->FstParam < 0)
> +      Size = EmitStrLen(CS.getArgument(0), StdBuilder, TD, TLI);
> +    else
> +      // strndup(str, maxlen): size = strnlen(str, maxlen)+1
> +      Size = EmitStrNLen(CS.getArgument(0), CS.getArgument(FnData->FstParam),
> +                         StdBuilder, TD, TLI);
> +    if (!Size)
> +      return unknown();
> +    Builder.SetInsertPoint(StdBuilder.GetInsertPoint());
> +    Size = Builder.CreateNUWAdd(Size, ConstantInt::get(IntTy, 1));
> +    return std::make_pair(Size, Zero);
>   }
> 
>   Value *FirstArg = CS.getArgument(FnData->FstParam);
> @@ -634,11 +647,9 @@
>   return std::make_pair(Size, Zero);
> 
>   // TODO: handle more standard functions (+ wchar cousins):
> -  // - strdup / strndup
>   // - strcpy / strncpy
>   // - strcat / strncat
>   // - memcpy / memmove
> -  // - strcat / strncat
>   // - memset
> }
> 
> 
> Modified: llvm/trunk/lib/Transforms/Instrumentation/BoundsChecking.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/BoundsChecking.cpp?rev=160742&r1=160741&r2=160742&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/BoundsChecking.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/BoundsChecking.cpp Wed Jul 25 12:29:22 2012
> @@ -24,6 +24,7 @@
> #include "llvm/Support/TargetFolder.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/Target/TargetData.h"
> +#include "llvm/Target/TargetLibraryInfo.h"
> #include "llvm/Transforms/Instrumentation.h"
> using namespace llvm;
> 
> @@ -48,6 +49,7 @@
> 
>     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>       AU.addRequired<TargetData>();
> +      AU.addRequired<TargetLibraryInfo>();
>     }
> 
>   private:
> @@ -166,11 +168,12 @@
> 
> bool BoundsChecking::runOnFunction(Function &F) {
>   TD = &getAnalysis<TargetData>();
> +  const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
> 
>   TrapBB = 0;
>   BuilderTy TheBuilder(F.getContext(), TargetFolder(TD));
>   Builder = &TheBuilder;
> -  ObjectSizeOffsetEvaluator TheObjSizeEval(TD, F.getContext());
> +  ObjectSizeOffsetEvaluator TheObjSizeEval(TD, TLI, F.getContext());
>   ObjSizeEval = &TheObjSizeEval;
> 
>   // check HANDLE_MEMORY_INST in include/llvm/Instruction.def for memory
> 
> Added: llvm/trunk/test/Instrumentation/BoundsChecking/strings.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/BoundsChecking/strings.ll?rev=160742&view=auto
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/BoundsChecking/strings.ll (added)
> +++ llvm/trunk/test/Instrumentation/BoundsChecking/strings.ll Wed Jul 25 12:29:22 2012
> @@ -0,0 +1,31 @@
> +; RUN: opt < %s -bounds-checking -S | FileCheck %s
> +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +
> +declare noalias i8* @strdup(i8* nocapture) nounwind
> +declare noalias i8* @strndup(i8* nocapture, i64) nounwind
> +
> +; CHECK: @f1
> +define i8 @f1(i8* nocapture %str, i8** nocapture %esc) nounwind uwtable ssp {
> +; CHECK: call i64 @strlen(i8* %str)
> +; CHECK-NEXT: %1 = add nuw i64 {{.*}}, 1
> +  %call = tail call i8* @strdup(i8* %str) nounwind
> +  store i8* %call, i8** %esc, align 8
> +  %arrayidx = getelementptr inbounds i8* %call, i64 3
> +; CHECK: sub i64 %1, 3
> +  %1 = load i8* %arrayidx, align 1
> +  ret i8 %1
> +; CHECK: call void @llvm.trap
> +}
> +
> +; CHECK: @f2
> +define i8 @f2(i8* nocapture %str, i8** nocapture %esc, i64 %limit) nounwind uwtable ssp {
> +; CHECK: call i64 @strnlen(i8* %str, i64 %limit)
> +; CHECK-NEXT: %1 = add nuw i64 {{.*}}, 1
> +  %call = tail call i8* @strndup(i8* %str, i64 %limit) nounwind
> +  store i8* %call, i8** %esc, align 8
> +  %arrayidx = getelementptr inbounds i8* %call, i64 3
> +; CHECK: sub i64 %1, 3
> +  %1 = load i8* %arrayidx, align 1
> +  ret i8 %1
> +; CHECK: call void @llvm.trap
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120725/ad4a46d1/attachment.html>


More information about the llvm-commits mailing list