<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>