<div dir="ltr"><div><div><div>Hi,<br><br></div>Thanks both of you for the help. I just missed that Create function had many optional arguments... sorry for that. However my problem wasn't coming from here (IRBuilder CreateCall function still return a pointer to CallInst so I just added 2 times the call?). I didn't wanted to detail the all issue previously because I knew I had a problem with my syntax. So here's my problem:<br><br></div>I am doing this replacement operation in a FunctionPass (this is no restriction, I could do it on a ModulePass if that's a solution). On each Function given I do an iteration over the instructions and replace (if it's a call to the right function) the call. It's like this:<br><br>bool FDPFunction::runOnFunction(Function &F) {<br></div>  bool res = false;<br><div>  TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();<br><br>  for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i) {<br>    Instruction *I = &*i;<br>    <br>    if (!I) {<br>      errs() << "error: null pointer instruction\n";<br>      break;<br>    } else if (isMyFunctionCall(I, TLI)) {<br>      errs() << "found a call to the function to replace\n";<br></div><div>      res = true;<br></div><div>      replacement_function(I);<br>    } else {<br>      errs() << "default: trash instruction\n";<br>    }<br>  }<br><br>  return res;<br>}<br><br></div><div>The problem is that after the first replacement, the iterator becomes a null pointer. With the break instruction the program is correctly instrumented for the first call (about that: what is the use of replaceAllUsesWith function? I thought it would replace all uses of the function... but just one is done). I can then link it and execute with lli (I still get a: "*** Error in `lli': corrupted double-linked list: 0xaddress ***" but after the whole execution is done).<br><br></div><div>But if I remove the break and the if condition associated, well I get a null pointer exception : Assertion `Val && "isa<> used on a null pointer"' failed<br><br></div><div>I tried to clone the current instruction to not modify the iterator but the ReplaceInstWithInst will cause troubles (probably because a copied instruction has no parents):<br><br>#0 0x0000000002a95b5c llvm::sys::PrintStackTrace(llvm::raw_ostream&) /home/pierre/Desktop/llvm/lib/Support/Unix/Signals.inc:400:0<br>#1 0x0000000002a95edf PrintStaI tried to clone the current instruction to not modify the iterator but the ReplaceInstWithInst will cause troublesckTraceSignalHandler(void*) /home/pierre/Desktop/llvm/lib/Support/Unix/Signals.inc:468:0<br>#2 0x0000000002a94145 llvm::sys::RunSignalHandlers() /home/pierre/Desktop/llvm/lib/Support/Signals.cpp:44:0<br>#3 0x0000000002a953a8 SignalHandler(int) /home/pierre/Desktop/llvm/lib/Support/Unix/Signals.inc:254:0<br>#4 0x00007fe358d3dd10 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x10d10)<br>#5 0x00000000011fe489 llvm::iplist<llvm::Instruction, llvm::SymbolTableListTraits<llvm::Instruction> >::insert(llvm::ilist_iterator<llvm::Instruction>, llvm::Instruction*) /home/pierre/Desktop/llvm/include/llvm/ADT/ilist.h:415:0<br>#6 0x0000000002abc20d llvm::ReI tried to clone the current instruction to not modify the iterator but the ReplaceInstWithInst will cause troublesplaceInstWithInst(llvm::SymbolTableList<llvm::Instruction>&, llvm::ilist_iterator<llvm::Instruction>&, llvm::Instruction*) /home/pierre/Desktop/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:198:0<br>#7 0x0000000002abc2a5 llvm::ReplaceInstWithInst(llvm::Instruction*, llvm::Instruction*) /home/pierre/Desktop/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp:210:0<br><br></div><div>Any idea on what could be the cause of the null pointer and how to avoid it?<br><br></div><div>Thanks a lot for your time!<br></div><div>Pierre<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 20 June 2016 at 15:45, John Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><span class="">
    <div>On 6/20/16 6:17 AM, Pierre Gagelin via
      llvm-dev wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div>
          <div>
            <div>Hi everyone,<br>
              <br>
            </div>
            I am trying to replace the call of a certain function with a
            call to another function. It would for example replace the
            following:<br>
            <br>
            %call = tail call noalias i8* @func(i64 10)<br>
          </div>
          <div>by<br>
            %call = tail call noalias i8* @other_func(i64 10)<br>
          </div>
          <div><br>
          </div>
          <div>I managed to declare other_func correctly but I am having
            troubles to understand how I should proceed to do the
            replacement.<br>
          </div>
          <div><br>
            I tried to use ReplaceInstWithInst function as follows:<br>
            <br>
            CallInst *call_to_other_func_inst =
            IRBuilder.CreateCall(ptr_to_other_func, args);<br>
            ReplaceInstWithInst(call_to_func_inst, newI);<br>
            <br>
          </div>
          LLVM builds correctly but the instrumentation crashes at
          optimization time. I know this isn't the correct way to do it
          because IRBuilder generates IR and I just want to have an
          instance of a CallInst. But I don't see how it is supposed to
          be done?<br>
        </div>
      </div>
    </blockquote>
    <br></span>
    Do you have assertions enabled?  If so, is the crash an assertion
    failure and, if so, which assertion is failing?  It's nearly
    impossible to tell what the problem is just by knowing that it is
    crashing.<span class=""><br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div><br>
          There are methods to create CallInst in the Instruction.h file
          but those needs to give an inserting point. Shoud I insert the
          call to other_func before the one to func and just remove the
          call instruction to func?<br>
        </div>
      </div>
    </blockquote>
    <br></span>
    Yes.  You need to place the new call instruction within the same
    basic block as the old call instruction.  Placing it right before
    the old call instruction is a good place.<br>
    <br>
    The code that Ashutosh provided is what I'd use to do what you're
    doing.<br>
    <br>
    Regards,<br>
    <br>
    John Criswell<br>
    <br>
    <blockquote type="cite"><span class="">
      <div dir="ltr">
        <div><br>
        </div>
        <div>Thanks for your help,<br>
        </div>
        <div>Pierre<br>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      </span><pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><span class="HOEnZb"><font color="#888888">
</font></span></pre><span class="HOEnZb"><font color="#888888">
    </font></span></blockquote><span class="HOEnZb"><font color="#888888">
    <br>
    <p><br>
    </p>
    <pre cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
  </font></span></div>

</blockquote></div><br></div>