This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Question about function call stack


On Jan 18, 2006, at 1:25 AM, Emmanuel Pacaud wrote:
Perry Smith a écrit :
With C, you can not really assume anything.

If you are trying to do this for one particular platform, then you can look at the code generated and eventually figure out how to do what you want to do. If you are doing 32 bit and 64 bit on one platform, then you could #ifdef the two cases.

That's probably what I'll do. Or find an other way to implement what is currently done.



But if you truly want portable code, then you need to either use varargs or stdargs. stdargs is part of the C standard I believe. It is pretty easy to use.

I guess varargs or stdargs are useles here, since the goal is to implement a function call with a variable number or arguments, not a function with a variable number of arguments.

I'm not sure I understand the difference. Are you trying to call functions that you can not change? Like call from an interpreter back into compiled C code?


I've done that before. Maybe I should say I've tried that before. If you have only integer type arguments, you have a pretty good chance. But if you have a mix of integers (or longs or shorts) and floats (or doubles), then it gets very weird and maybe impossible. This is especially true on some RISC type processors. What I did finally in my project was I had only a limited number of functions that I could call and I had glue code from the interpreter back to the library routine for each of those special cases.

If that is what you are trying to do, you might post this question to gcc instead of gcc-help.

The problem comes up with RISC architectures because the arguments never make it to the stack. They are passed in registers. But for the float and integer case, you have to know what you are passing at compile time (which the compiler can figure out) -- not at run time. If you are trying to do that at run time, it seems like you would almost have to do it in assembly language so you can move argument N to the general purpose register or the floating point register based upon its type.

Good luck.
Perry


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]