<div class="gmail_quote">Hi Duncan,<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


I couldn't find the solution to my problem (if it has one) in the mailing list or the source code. The problem is: how can I redefine a function that's been called already by some other function?<br>
</blockquote>
<br></div>
why do you want to do this?<br><div class="im"></div></blockquote><div class="im"><br>To implement something that is common in Lisp. Suppose I have a program that is running and can't be stopped or the cost being stoped is prohibitive. If I find a better way to run an algorithm, I'd like to update the running program non-stopping.<br>

<br><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Suppose I have 3 files, all compiled to bytecode through llvm-gcc (I think it could be clang instead).<br>
<br>
File1.c:<br>
void do_print() { print(); }<br>
<br>
File2.c:<br>
void print() { printf("File2.c\n"); }<br>
<br>
File3.c:<br>
void print() { printf("File3.c\n"); }<br>
</blockquote>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
The solution in C is to give the version in File2 a weak linkage type,<br>
for example using gcc's "weak" attribute.  You then link all three files<br>
together, and the weak print in File2 will be magically replaced with the<br>
non-weak print in File3.</blockquote><div class="im"><br>Never heard of it before. After a quick reading, it sounds OK. Keeping the rest of the file, changed the attribute and this section:<br><br>  func = EE->FindFunctionNamed ("do_print");<br>

  EE->runFunction(func, std::vector<GenericValue> ());<br>  Linker::LinkModules(main_file, print2, &ErrorMessage);<br>  EE->runFunction(func, std::vector<GenericValue> ());<br><br>And now I get this error before the second runFunction:<br>

<br>While deleting: void ()* %print<br>An asserting value handle still pointed to this value!<br>UNREACHABLE executed at /home/miranda/llvm-2.6/lib/VMCore/Value.cpp:492!<br><br>I suppose that's because "do_print" was already called. By the way, it seems like weak attribute is only supported for ELF and a.out. Maybe not the better solution.<br>


<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
  //swap the definition of the function "print" from the one in File2.c to File3.c<br>
  swap (file1, file2, file3);<br>
</blockquote>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
If all the functions are in the same module, then you can use<br>
FunctionA->replaceAllUsesWith(FunctionB) if they have the same<br>
type.<font color="#888888"><br></font></blockquote><div><br>Sorry I didn't see that function before. But, when I tried that (pastebin code: <a href="http://pastebin.com/m2485ae4f">http://pastebin.com/m2485ae4f</a>), it still doesn't print as supposed. It calls only the first function printing<br>

File2.c<br>File2.c<br></div></div><br>Maybe that works when the functions haven't been called before. Am I using the wrong way or had to do something before?<br><br>Thanks,<br><br>Miranda<br>