sebald.ziegler.maillist at ikolus.de
2013-Aug-07 16:57 UTC
[LLVMdev] DSA - LocalDataStructures pass does not create DSGraphs
Hallo. I wanted to use the DSA from the poolalloc project as a starting point for static C code analysis (for me it has some benefits to work on LLVM-IR (generated by clang) instead of C code). Currently there is no poolalloc version 3.3. Therefore I wrote a quick patch to make poolalloc 3.2 compile with llvm 3.3 (mostly adaptions to file relocations were necessary). The patch is attached as it is quite small. With the foundations working a simple test before getting serious seemed to be a good idea. So I tried to perform the LocalAnalysis (LocalDataStructures pass in poolalloc) on the running example (LLVM-IR obtained by clang) of Chris Lattner's PHD thesis (p. 44) (code attached). When this pass(LocalDataStructures) is run I can call dumpCallGraph() on it and get the correct result. But calls to hasDSGraph(const Function &F) all return false although they should not. DSGraphs should have been built. Does anyone see what I am doing wrong? Or is this a bug? Thank you for any help and comments! Sebald -------------- next part -------------- A non-text attachment was scrubbed... Name: initialPortTo33.diff Type: text/x-patch Size: 61218 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130807/a4eb35a2/attachment.bin> -------------- next part -------------- ; ModuleID = '../tests/lattnersRunningExample.c' 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" target triple = "x86_64-unknown-linux-gnu" %struct.list = type { %struct.list*, i32 } @Global = global i32 10, align 4 ; Function Attrs: nounwind uwtable define void @do_all(%struct.list* %L, void (i32*)* %FP) #0 { entry: %L.addr = alloca %struct.list*, align 8 %FP.addr = alloca void (i32*)*, align 8 store %struct.list* %L, %struct.list** %L.addr, align 8 store void (i32*)* %FP, void (i32*)** %FP.addr, align 8 br label %do.body do.body: ; preds = %do.cond, %entry %0 = load void (i32*)** %FP.addr, align 8 %1 = load %struct.list** %L.addr, align 8 %Data = getelementptr inbounds %struct.list* %1, i32 0, i32 1 call void %0(i32* %Data) %2 = load %struct.list** %L.addr, align 8 %Next = getelementptr inbounds %struct.list* %2, i32 0, i32 0 %3 = load %struct.list** %Next, align 8 store %struct.list* %3, %struct.list** %L.addr, align 8 br label %do.cond do.cond: ; preds = %do.body %4 = load %struct.list** %L.addr, align 8 %tobool = icmp ne %struct.list* %4, null br i1 %tobool, label %do.body, label %do.end do.end: ; preds = %do.cond ret void } ; Function Attrs: nounwind uwtable define void @addG(i32* %X) #0 { entry: %X.addr = alloca i32*, align 8 store i32* %X, i32** %X.addr, align 8 %0 = load i32* @Global, align 4 %1 = load i32** %X.addr, align 8 %2 = load i32* %1, align 4 %add = add nsw i32 %2, %0 store i32 %add, i32* %1, align 4 ret void } ; Function Attrs: nounwind uwtable define void @addGToList(%struct.list* %L) #0 { entry: %L.addr = alloca %struct.list*, align 8 store %struct.list* %L, %struct.list** %L.addr, align 8 %0 = load %struct.list** %L.addr, align 8 call void @do_all(%struct.list* %0, void (i32*)* @addG) ret void } ; Function Attrs: nounwind uwtable define %struct.list* @makeList(i32 %Num) #0 { entry: %Num.addr = alloca i32, align 4 %New = alloca %struct.list*, align 8 store i32 %Num, i32* %Num.addr, align 4 %call = call noalias i8* @malloc(i64 16) #2 %0 = bitcast i8* %call to %struct.list* store %struct.list* %0, %struct.list** %New, align 8 %1 = load i32* %Num.addr, align 4 %tobool = icmp ne i32 %1, 0 br i1 %tobool, label %cond.true, label %cond.false cond.true: ; preds = %entry %2 = load i32* %Num.addr, align 4 %sub = sub nsw i32 %2, 1 %call1 = call %struct.list* @makeList(i32 %sub) br label %cond.end cond.false: ; preds = %entry br label %cond.end cond.end: ; preds = %cond.false, %cond.true %cond = phi %struct.list* [ %call1, %cond.true ], [ null, %cond.false ] %3 = load %struct.list** %New, align 8 %Next = getelementptr inbounds %struct.list* %3, i32 0, i32 0 store %struct.list* %cond, %struct.list** %Next, align 8 %4 = load i32* %Num.addr, align 4 %5 = load %struct.list** %New, align 8 %Data = getelementptr inbounds %struct.list* %5, i32 0, i32 1 store i32 %4, i32* %Data, align 4 %6 = load %struct.list** %New, align 8 ret %struct.list* %6 } ; Function Attrs: nounwind declare noalias i8* @malloc(i64) #1 ; Function Attrs: nounwind uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 %X = alloca %struct.list*, align 8 %Y = alloca %struct.list*, align 8 store i32 0, i32* %retval %call = call %struct.list* @makeList(i32 10) store %struct.list* %call, %struct.list** %X, align 8 %call1 = call %struct.list* @makeList(i32 100) store %struct.list* %call1, %struct.list** %Y, align 8 %0 = load %struct.list** %X, align 8 call void @addGToList(%struct.list* %0) store i32 20, i32* @Global, align 4 %1 = load %struct.list** %Y, align 8 call void @addGToList(%struct.list* %1) ret i32 0 } attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #2 = { nounwind } -------------- next part -------------- A non-text attachment was scrubbed... Name: main.cpp Type: text/x-c++src Size: 1298 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130807/a4eb35a2/attachment.cpp>
sebald.ziegler.maillist at ikolus.de
2013-Aug-08 14:30 UTC
[LLVMdev] DSA - LocalDataStructures pass does not create DSGraphs
On Wednesday, August 07, 2013 18:57:16 sebald.ziegler.maillist at ikolus.de wrote:> Hallo. > > I wanted to use the DSA from the poolalloc project as a starting point for > static C code analysis (for me it has some benefits to work on LLVM-IR > (generated by clang) instead of C code). > > Currently there is no poolalloc version 3.3. Therefore I wrote a quick > patch to make poolalloc 3.2 compile with llvm 3.3 (mostly adaptions to > file relocations were necessary). The patch is attached as it is quite > small. > > With the foundations working a simple test before getting serious seemed to > be a good idea. So I tried to perform the LocalAnalysis > (LocalDataStructures pass in poolalloc) on the running example (LLVM-IR > obtained by clang) of Chris Lattner's PHD thesis (p. 44) (code attached). > > When this pass(LocalDataStructures) is run I can call dumpCallGraph() on it > and get the correct result. But calls to hasDSGraph(const Function &F) all > return false although they should not. DSGraphs should have been built. > > Does anyone see what I am doing wrong? Or is this a bug?Found out what I did wrong: - PassManager performs cleanup operations (I thought this would only happen if the PM's dtor gets called) - stuff gets deleted but parts are still accessible (call graph information) So this question has actually nothing to do with DSA. Solution: Acknowledge the existence of the PassManager environment -> write own pass that consumes the information of LocalDataStructures pass...> > Thank you for any help and comments! > > Sebald