<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Another thing I just tried was to give
      'sum()' the following implementation:<br>
      <br>
      <font face="Courier New, Courier, monospace">    int sum(int a,
        int b) { return 99; }<br>
        <br>
        <font face="sans-serif">Now what I did was:<br>
          <br>
              1. Call 'get_int()' which will call 'sum(){return 99;}'<br>
              2. Change the call instruction to 'sum_mockup', I dumped
          the code and the change is done, but when calling 'get_int()'
          it calls </font></font><font face="Courier New, Courier,
        monospace"><font face="sans-serif">'sum(){return 99;}'</font></font><br>
      <br>
      I know it might be too rushed to say what the problem is, but it
      seems that when a function has been compiled and executed in the
      JIT engine, it will remain linked to other functions no matter
      what regardless of changing the call instruction.<br>
      <br>
      On 29/06/14 09:00, Adrian Ortega wrote:<br>
    </div>
    <blockquote cite="mid:53B01C17.5000108@gmail.com" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <div class="moz-cite-prefix">I tried using
        'getPointerToFunction()' and the correct function I generated
        was called from C code, but when it runs inside the JIT engine
        it always returns the value of the first function. I even tried
        to 'deleteBody()' and 'removeFromParent()' from the first
        function generated, and still returns the first value.<br>
        <br>
        I also tried using 'dump()' to see if the values where being
        updated. This is the C code I run with the JIT engine:<br>
        <font face="Courier New, Courier, monospace"><br>
        </font>
        <blockquote><font face="Courier New, Courier, monospace">#include

            <stdio.h></font><br>
          <br>
          <font face="Courier New, Courier, monospace">int sum(int a,
            int b); // declaration</font><br>
          <br>
          <font face="Courier New, Courier, monospace">int get_int(int
            a, int b)</font><br>
          <font face="Courier New, Courier, monospace">{</font><br>
          <font face="Courier New, Courier, monospace">    int x =
            sum(a,b);</font><br>
          <font face="Courier New, Courier, monospace">    printf("The
            result was: %d\n",x);</font><br>
          <font face="Courier New, Courier, monospace">    return x;</font><br>
          <font face="Courier New, Courier, monospace">}</font><br>
          <br>
        </blockquote>
        As you can see I print the return value of the function. The
        functions I generate and that I called 'get_int_*()' in the
        previous email are now called 'sum_mockup_N()'. This is the code
        LLVM IR code:<br>
        <br>
        <blockquote><small><font face="Courier New, Courier, monospace">;
              Function Attrs: nounwind uwtable</font></small><br>
          <small><font face="Courier New, Courier, monospace">define i32
              @get_int(i32 %a, i32 %b) #0 {</font></small><br>
          <small><font face="Courier New, Courier, monospace">entry:</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %a.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %b.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %x =
              alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %a, i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %b, i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %0 =
              load i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %1 =
              load i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  <b><big><small>%call

                    = call i32 @sum_mockup(i32 %0, i32 %1)</small></big></b></font></small>
          <small><font face="Courier New, Courier, monospace"><b>; Use
                the first function generated</b></font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %call, i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %2 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %call1 =
              call i32 (i8*, ...)* @printf(i8* getelementptr inbounds
              ([20 x i8]* @.str, i32 0, i32 0), i32 %2)</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %3 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  ret i32
              %3</font></small><br>
          <small><font face="Courier New, Courier, monospace">}</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace">The result
              was: 10</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace">; sum
              always remains a declaration</font></small><br>
          <small><font face="Courier New, Courier, monospace">declare
              i32 @sum(i32, i32) #1</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace"><b>define
                i32 @sum_mockup(i32, i32)</b> <b>#1 {</b></font></small><b><br>
          </b><b><small><font face="Courier New, Courier, monospace">mockup_block:</font></small></b><b><br>
          </b><b><small><font face="Courier New, Courier, monospace"> 
                ret i32 10</font></small></b><b><br>
          </b><b><small><font face="Courier New, Courier, monospace">}</font></small></b><br>
          <br>
          <small><font face="Courier New, Courier, monospace">****************************</font></small><br>
          <font face="Courier New, Courier, monospace"><b><small>[C
                Code] getPointerToFunction()= 10</small></b><b> </b><b><small>
                // Pointer to</small></b> </font><small><font
              face="Courier New, Courier, monospace"><b>@sum_mockup(i32,
                i32)</b></font></small><br>
          <small><font face="Courier New, Courier, monospace">****************************</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace">; Function
              Attrs: nounwind uwtable</font></small><br>
          <small><font face="Courier New, Courier, monospace">define i32
              @get_int(i32 %a, i32 %b) #0 {</font></small><br>
          <small><font face="Courier New, Courier, monospace">entry:</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %a.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %b.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %x =
              alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %a, i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %b, i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %0 =
              load i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %1 =
              load i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  <b>%call

                = call i32 @sum(i32 %0, i32 %1)</b></font></small> <b><small><font
                face="Courier New, Courier, monospace">// Change it back
                to the declaration</font></small></b><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %call, i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %2 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %call1 =
              call i32 (i8*, ...)* @printf(i8* getelementptr inbounds
              ([20 x i8]* @.str, i32 0, i32 0), i32 %2)</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %3 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  ret i32
              %3</font></small><br>
          <small><font face="Courier New, Courier, monospace">}</font></small><br>
          <br>
          <br>
          <small><font face="Courier New, Courier, monospace">; Function
              Attrs: nounwind uwtable</font></small><br>
          <small><font face="Courier New, Courier, monospace">define i32
              @get_int(i32 %a, i32 %b) #0 {</font></small><br>
          <small><font face="Courier New, Courier, monospace">entry:</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %a.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %b.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %x =
              alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %a, i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %b, i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %0 =
              load i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %1 =
              load i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  <b>%call

                = call i32 @sum_mockup_1(i32 %0, i32 %1) ; Use the other
                function generated</b></font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %call, i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %2 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %call1 =
              call i32 (i8*, ...)* @printf(i8* getelementptr inbounds
              ([20 x i8]* @.str, i32 0, i32 0), i32 %2)</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %3 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  ret i32
              %3</font></small><br>
          <small><font face="Courier New, Courier, monospace">}</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace">The result
              was: 10</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace">declare
              i32 @sum(i32, i32) #1</font></small><br>
          <br>
          <br>
          <b><small><font face="Courier New, Courier, monospace">define
                i32 @sum_mockup_1(i32, i32) #1 {</font></small></b><b><br>
          </b><b><small><font face="Courier New, Courier, monospace">mockup_block:</font></small></b><b><br>
          </b><b><small><font face="Courier New, Courier, monospace"> 
                ret i32 5</font></small></b><b><br>
          </b><b><small><font face="Courier New, Courier, monospace">}</font></small></b><br>
          <br>
          <small><font face="Courier New, Courier, monospace">****************************</font></small><br>
          <b><small><font face="Courier New, Courier, monospace">[C
                Code] getPointerToFunction()= 5</font></small></b>  <font
            face="Courier New, Courier, monospace"><small><b>// Pointer
                to</b></small></font> <small><font face="Courier New,
              Courier, monospace"><b>@sum_mockup_1(i32, i32)</b></font></small><br>
          <small><font face="Courier New, Courier, monospace">****************************</font></small><br>
          <br>
          <small><font face="Courier New, Courier, monospace">; Function
              Attrs: nounwind uwtable</font></small><br>
          <small><font face="Courier New, Courier, monospace">define i32
              @get_int(i32 %a, i32 %b) #0 {</font></small><br>
          <small><font face="Courier New, Courier, monospace">entry:</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %a.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %b.addr
              = alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %x =
              alloca i32, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %a, i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %b, i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %0 =
              load i32* %a.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %1 =
              load i32* %b.addr, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  <b>%call

                = call i32 @sum(i32 %0, i32 %1)</b></font></small> <b><small><font
                face="Courier New, Courier, monospace">// Change it back
                to the declaration</font></small></b><br>
          <small><font face="Courier New, Courier, monospace">  store
              i32 %call, i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %2 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %call1 =
              call i32 (i8*, ...)* @printf(i8* getelementptr inbounds
              ([20 x i8]* @.str, i32 0, i32 0), i32 %2)</font></small><br>
          <small><font face="Courier New, Courier, monospace">  %3 =
              load i32* %x, align 4</font></small><br>
          <small><font face="Courier New, Courier, monospace">  ret i32
              %3</font></small><br>
          <small><font face="Courier New, Courier, monospace">}</font></small><br>
        </blockquote>
        <br>
        If I get a pointer to the function 'get_int()' I still have the
        same problem of getting the same return value of the first
        generated function. But when I get a pointer to the generated
        functions themselves 'sum_mockup_*()' I get the actual value I'm
        expecting.<br>
        <br>
        <br>
        <br>
        On 28/06/14 22:48, Yaron Keren wrote:<br>
      </div>
      <blockquote
cite="mid:CANa4zJp4N_jdA5EtaVdsJyLEGXoH2o2--89739ejjnWP6FUvVQ@mail.gmail.com"
        type="cite">
        <div dir="rtl">
          <div dir="ltr">getFunction() -> getPointerToFunction()</div>
          <div dir="ltr"><br>
          </div>
          <div dir="ltr"><br>
          </div>
        </div>
        <div class="gmail_extra">
          <div dir="ltr"><br>
            <br>
            <div class="gmail_quote">2014-06-29 6:40 GMT+03:00 Yaron
              Keren <span dir="ltr"><<a moz-do-not-send="true"
                  href="mailto:yaron.keren@gmail.com" target="_blank">yaron.keren@gmail.com</a>></span>:<br>
              <blockquote class="gmail_quote" style="margin:0
                .8ex;border-left:1px #ccc solid;border-right:1px #ccc
                solid;padding-left:1ex;padding-right:1ex">
                <div dir="rtl">
                  <div dir="ltr">Hi Adrian,</div>
                  <div dir="ltr"><br>
                  </div>
                  <div dir="ltr"> <span
                      style="font-family:arial,sans-serif;font-size:12.727272033691406px">freeMachineCodeForFunction

                      is required but </span><span
                      style="font-family:arial,sans-serif;font-size:12.727272033691406px">recompileAndLinkFunction

                      is not,</span></div>
                  <div dir="ltr"><span
                      style="font-family:arial,sans-serif;font-size:12.727272033691406px">you

                      can use </span>getFunction() always.<br>
                  </div>
                  <div dir="ltr"><br>
                  </div>
                  <div dir="ltr">Try to  M->dump()
                    calling M->getFunction() where M is the Module *.</div>
                  <div dir="ltr">See if how the changes appear in the
                    module dump as expected.</div>
                  <div dir="ltr"><br>
                  </div>
                  <div dir="ltr">Yaron</div>
                  <div dir="ltr"><br>
                  </div>
                  <div dir="ltr"><br>
                  </div>
                  <div dir="ltr"><br>
                  </div>
                </div>
                <div class="gmail_extra"> <br>
                  <br>
                  <div class="gmail_quote">
                    <div dir="ltr">2014-06-29 5:56 GMT+03:00 Adrian
                      Ortega <span dir="ltr"><<a
                          moz-do-not-send="true"
                          href="mailto:elfus0.1@gmail.com"
                          target="_blank">elfus0.1@gmail.com</a>></span>:</div>
                    <blockquote class="gmail_quote" style="margin:0 0 0
                      .8ex;border-left:1px #ccc solid;padding-left:1ex">
                      <div>
                        <div class="h5">
                          <div text="#000000" bgcolor="#FFFFFF"> Hello,<br>
                            <br>
                            The problem I'm having is that I modify a
                            function body by using
                            'Value::replaceAllUsesWith' and then execute
                            it with the JIT engine several times but I
                            always get the output from the first
                            iteration for all the iterations.<br>
                            <br>
                            This is what I do:<br>
                            <br>
                            <br>
                            I generate the following 2 functions on the
                            fly based on the FunctionType of the
                            declaration below in C code.<br>
                                <br>
                            <blockquote><font face="Courier New,
                                Courier, monospace">define i32
                                @get_int_5(i32, i32) #1 {</font><br>
                              <font face="Courier New, Courier,
                                monospace">  ret i32 5</font><br>
                              <font face="Courier New, Courier,
                                monospace">}</font><br>
                              <br>
                              <font face="Courier New, Courier,
                                monospace">define i32 @get_int_10(i32,
                                i32) #1 {</font><br>
                              <font face="Courier New, Courier,
                                monospace">  ret i32 10</font><br>
                              <font face="Courier New, Courier,
                                monospace">}</font></blockquote>
                            I have the following C code:
                            <blockquote><br>
                              <font face="Courier New, Courier,
                                monospace"><font face="Courier New,
                                  Courier, monospace">// This is only a
                                  declaration<br>
                                  // I use this FunctionType to generate
                                  the functions above<br>
                                </font>int sum(int a, int b); <br>
                                <br>
                                int get_int()<br>
                                {</font><font face="Courier New,
                                Courier, monospace"><font face="Courier
                                  New, Courier, monospace"><br>
                                </font>    return sum(a,b); <br>
                                }<br>
                                <br>
                              </font></blockquote>
                            I replace the  call to 'sum()' by calling
                            Value::replaceAllUsesWith for one of the
                            functions generated above, run with JIT. I
                            checked the code generated and it actually
                            changes the call from 'sum()' to
                            'get_int_5()' and I get a 5 as return value
                            when I call the function with the JIT
                            execution engine.<br>
                            <br>
                            Then I repeat the previous step using
                            'Value::replaceAllUsesWith' for the next
                            function I generated and run it with JIT.
                            Then again the code generated is what I
                            expected, this time<br>
                            function call changes from 'sum()' to
                            'get_int_10()', however the problem is I get
                            a 5 instead of a 10.<br>
                            <br>
                            I tried 'recompileAndLinkFunction' as well
                            as 'freeMachineCodeForFunction' and I always
                            get the return value from the first
                            function, and not the second as I should
                            even though the generated code that I dump()
                            says that it has the correct function call.<br>
                            <br>
                            I am using version 3.4 for both clang and
                            llvm. And also I'm using the JIT Engine and
                            not the MCJIT.<br>
                            <br>
                            Do you have have any idea why the references
                            or 'uses' changes are not reflected in the
                            code JIT'ed ?<br>
                            <br>
                            Regards.<br>
                            <blockquote><br>
                            </blockquote>
                                <br>
                            <br>
                            <br>
                            <br>
                            <br>
                          </div>
                          <br>
                        </div>
                      </div>
                      _______________________________________________<br>
                      LLVM Developers mailing list<br>
                      <a moz-do-not-send="true"
                        href="mailto:LLVMdev@cs.uiuc.edu"
                        target="_blank">LLVMdev@cs.uiuc.edu</a>        
                      <a moz-do-not-send="true"
                        href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
                      <a moz-do-not-send="true"
                        href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev"
                        target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
                      <br>
                    </blockquote>
                  </div>
                  <br>
                </div>
              </blockquote>
            </div>
          </div>
        </div>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>