[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