On 12/16/2010 04:57 PM, Mulyadi Santosa wrote:
With my limited C knowledge, I saw that as a instruction jump (to
tb_ptr). The "code_gen_prologue" seems to me like a cast..... casting
each opcode in tb_ptr as uint8_t.... with maximum length=1024
Hi! Thank you for your reply!
I've got an explanation from a C guru :)
((long REGPARM (*)(void *))code_gen_prologue)(tb_ptr)
---------
(long REGPARM (*)(void *)) is a type: a pointer pointing to a function, which takes
one (void*) parameter. code_gen_prologue is an>array, array's name when used is
considered to be a pointer to its first element, thus you are casting here pointer to
the first byte of>array to pointer to function (...).
Ellipsis with tb_ptr mean 'call function under this address and pass there
whatever tb_ptr is'
Now everything is very clear for me :)
I do know pointer to functions, and if I had got:
long REGPARM (*myfunc)(void *)
I would have recognized it.. but removing the function pointer name,
leaving only the * was enough for me to be lost :[
also the definition of code_gen_prologue was tricky:
uint8_t code_gen_prologue[1024] code_gen_section;
that code_gen_section at first confused my idea of a normal variable
definition as "type identifier" .. until I found out it was a define for
a compiler directive (alignment) :[
So inside code_gen_prologue array there is stored some function (in
binary code) that takes a tb_ptr as argument and returns a long .. I
have to check what it is inside there for understanding how the
translated target code is run now ;)
I hope that's the right interpretation...I must admit Qemu is full of
gcc and C tricks here and there...
Yes! I've only had some experience in OO programming, really always
avoided defines and odd compiler directives in my code before..
Best Regards!
Stefano B.