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


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.

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 get the idea that stdard is preferred but I see varag used more often in code.

Google "stdarg" will get you to a man page. Your system probably has a man page for stdarg on it.

HTH
pedz


On Jan 17, 2006, at 9:32 AM, Emmanuel Pacaud wrote:


Hi,

In a project I'm working on, I've to fix an issue which is dependant on the target platform.

You'll find below a code snippet that shows the issue. When compiled for a 32 bit platform, with gcc 3.2.2, I get the expected behaviour, which is the following output:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

But, if compiled for a 64 bit platform, with gcc 3.4.3, output is:

1 548682058152 4194884 0 -72340172838076673 0 0 1 2 3
0 1 2 3 4 5 6 7 8 9

Here's my question:

Is the assumption made in code snippet that pushing an ulong array on the stack, then retrieving values via function arguments correct ?

Regards,

Emmanuel.

#include <stdio.h>
#include <stdlib.h>

#define SIZE 10

void
f (ulong v1, ulong v2, ulong v3, ulong v4, ulong v5, ulong v6, ulong v7, ulong v8, ulong v9, ulong v10)
{
printf ("%li %li %li %li %li %li %li %li %li %li \n",
v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
}


typedef struct {
	ulong array[SIZE];
} Stack;

void
g (Stack stack)
{
	int i;

	for (i = 0; i < SIZE; i++)
		printf ("%li ", stack.array[i]);
	printf ("\n");
}

int
main (int argc, char *argv[])
{
	void (*function_ptr) ();
	Stack stack;
	int i;

	for (i = 0; i < SIZE; i++)
		stack.array[i] = i;
	
	function_ptr = f;
	(*function_ptr) (stack);
	function_ptr = g;
	(*function_ptr) (stack);

  	exit(0);
}


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