[LLVMdev] BasicCallGraph patch
Zhongxing Xu
xuzhongxing at gmail.com
Mon Jul 16 22:36:35 PDT 2007
I am doing inter-procedural static analysis, so I need to do DFS of call
graph. llvm-gcc sometimes generates this kind of call instruction, which
cause the call graph to be incomplete.
But thanks for your information, instcombine really solves the problem.
On 7/17/07, Chris Lattner <sabre at nondot.org> wrote:
>
> On Thu, 12 Jul 2007, Zhongxing Xu wrote:
> > The current BasicCallGraph will miss call sites like this:
> > %tmp86 = call i8* (...)* bitcast (i8* ()* @find_ispell to i8* (...)*)( )
> > ; <i8*> [#uses=1]
> >
> > Here the direct user of @find_ispell is a ConstantExpr.
> > I added several lines of code to address this case.
> > Below is the output of command: svn diff lib/Analysis/IPA/CallGraph.cpp
> > Attached is LLVM asm files with such function calls.
>
> This is problematic, because it's not checking for the type of constant
> expr (i.e. is it a bitcast, etc). That can easily be fixed, but here's a
> basic question: when is this important? The instcombine pass should fix
> up these bitcasts, so they shouldn't occur frequently in practice. When
> have you found this to be important?
>
> Thanks,
>
> -Chris
>
> > Index: lib/Analysis/IPA/CallGraph.cpp
> > ===================================================================
> > --- lib/Analysis/IPA/CallGraph.cpp (revision 39771)
> > +++ lib/Analysis/IPA/CallGraph.cpp (working copy)
> > @@ -13,6 +13,7 @@
>
> > //===----------------------------------------------------------------------===//
> >
> >
> > #include "llvm/Analysis/CallGraph.h"
> > +#include "llvm/Constants.h"
> > # include "llvm/Module.h"
> > # include "llvm/Instructions.h"
> > # include "llvm/Support/CallSite.h"
> > @@ -150,6 +151,19 @@
> > -> addCalledFunction(CS, Node);
> > else
> > isUsedExternally = true;
> > + } else if (ConstantExpr* CE = dyn_cast<ConstantExpr>(*I)) {
> > + for (Value::use_iterator I = CE->use_begin(), E =
> CE->use_end();
> > + I != E; ++I)
> > + if (Instruction* Inst = dyn_cast<Instruction>(*I)) {
> > + CallSite CS = CallSite::get(Inst);
> > + if (isOnlyADirectCall(F, CS))
> > + getOrInsertFunction(Inst->getParent()->getParent())
> > + ->addCalledFunction(CS, Node);
> > + else
> > + isUsedExternally = true;
> > + } else {
> > + isUsedExternally = true;
> > + }
> > } else if (GlobalValue *GV = dyn_cast<GlobalValue>(*I)) {
> > for (Value::use_iterator I = GV->use_begin(), E =
> GV->use_end();
> > I != E; ++I)
> >
> >
>
> -Chris
>
> --
> http://nondot.org/sabre/
> http://llvm.org/
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070717/95fb69f9/attachment.html>
More information about the llvm-dev
mailing list