[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

Nuno Lopes nunoplopes at sapo.pt
Wed Jul 25 11:42:33 PDT 2012


Yes, it basically broke all cmake buildbots.
I'm taking a look; sorry for the breakage.

Thanks,
Nuno


Quoting Manman Ren <mren at apple.com>:

> 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
>> +}
>>



More information about the llvm-commits mailing list