[LLVMdev] Help with LLVM Bitcode function inlining and duplicating debug information on instructions

David Blaikie dblaikie at gmail.com
Fri Aug 30 08:20:04 PDT 2013


On Fri, Aug 30, 2013 at 4:38 AM, Daniel Liew <daniel.liew at imperial.ac.uk> wrote:
> Hi,
>
> I'm working on a tool (KLEE) that interprets LLVM bitcode.
>
> One of the things it does is it instruments the LLVM bitcode with
> checks for division by zero. It does this by injecting calls to a
> function "klee_div_zero_check(long long divisor)" just before every
> division instruction (e.g. SDiv). These checks are injected by a pass
> that has been implemented in KLEE.
>
> This klee_div_zero_check() function is implemented in C and is
> compiled to LLVM Bitcode which is then linked into the module that
> KLEE is interpreting.
>
> I need to change the modify the LLVM bitcode module slightly and I'm
> not sure how to do this using the LLVM C++ APIs. So any help would be
> appreciated.
>
> Here are the two things I want to do...
>
> 1. Inline all calls to klee_div_zero_check() in the LLVM bitcode
> module being interpreted.
>
> I tried using the always_inline attribute on the C definition of
> klee_div_zero_check(), i.e.
>
> void __attribute__((always_inline)) klee_div_zero_check(long long z)
>
> but that only added the keyword "alwaysinline" to the
> klee_div_zero_check() function in the LLVM bitcode module, it didn't
> do any actual inlining.
>
> I see the LLVM API has the function
>
> llvm::InlineFunction(CallInst *CI, InlineFunctionInfo &IFI, bool InsertLifetime)
>
> Should I be using this to inline all calls in a module to a particular
> function or is there a better way? If so what is IFI supposed to be
> set to?

I'm going to guess (because I don't know a great deal about the
backend) that you want to link the bitcode file with the definition of
your utility function, into the bitcode file with the usage, so that
LLVM's midlevel optimizers have access to it & can inline it.

> 2. I want to duplicated the debug (filename and line number
> information) on the division instruction (e.g. SDiv) onto every
> instruction (including the instructions that come from inlining
> klee_div_zero_check ) that I inject into the LLVM bitcode module
> (during the pass). The reason for wanting to do this is because when
> KLEE reports an error it looks at the debug information of the
> previous instruction. Currently the debug information references the
> file that klee_div_zero_check() is defined in (which is useless for
> error reporting) rather than the debug information for the division
> instruction I am trying to instrument.

This... there might be a few ways. One way could be to build the
utility function without debug info - when it's inlined it /might/ end
up with the same debug info as the rest of the function it's inserted
into, but I'm not deeply familiar with LLVM's handling of debug info
while inlining yet.

>
> So how would I go about doing this using the LLVM C++ APIs?
>
> Thanks,
> Dan Liew.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev



More information about the llvm-dev mailing list