diff options
author | Walter Lee <walt@tilera.com> | 2013-02-19 16:09:13 +0000 |
---|---|---|
committer | Walter Lee <walt@tilera.com> | 2013-02-19 16:09:13 +0000 |
commit | bc23a95694a60908843d626bb29bdc7e241a9ad3 (patch) | |
tree | 27c77dfeab43cb8b620522bea670fa4401979a91 /gdb/tilegx-tdep.c | |
parent | 42f45f1a898dbc2e6f7fd3029cb8cad60a4dea8f (diff) | |
download | gdb-bc23a95694a60908843d626bb29bdc7e241a9ad3.zip gdb-bc23a95694a60908843d626bb29bdc7e241a9ad3.tar.gz gdb-bc23a95694a60908843d626bb29bdc7e241a9ad3.tar.bz2 |
* tilegx-tdep.c (tilegx_push_dummy_call): args pushed on stack
should be aligned to 64bit.
Diffstat (limited to 'gdb/tilegx-tdep.c')
-rw-r--r-- | gdb/tilegx-tdep.c | 22 |
1 files changed, 5 insertions, 17 deletions
diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c index 0c560ba..8be4046 100644 --- a/gdb/tilegx-tdep.c +++ b/gdb/tilegx-tdep.c @@ -292,7 +292,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch, int argreg = TILEGX_R0_REGNUM; int i, j; int typelen, slacklen, alignlen; - static const gdb_byte two_zero_words[8] = { 0 }; + static const gdb_byte four_zero_words[16] = { 0 }; /* If struct_return is 1, then the struct return address will consume one argument-passing register. */ @@ -326,18 +326,6 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch, /* Align SP. */ stack_dest = tilegx_frame_align (gdbarch, stack_dest); - /* Loop backwards through arguments to determine stack alignment. */ - alignlen = 0; - - for (j = nargs - 1; j >= i; j--) - { - typelen = TYPE_LENGTH (value_enclosing_type (args[j])); - alignlen += (typelen + 3) & (~3); - } - - if (alignlen & 0x4) - stack_dest -= 4; - /* Loop backwards through remaining arguments and push them on the stack, word aligned. */ for (j = nargs - 1; j >= i; j--) @@ -347,7 +335,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch, const gdb_byte *contents = value_contents (args[j]); typelen = TYPE_LENGTH (value_enclosing_type (args[j])); - slacklen = ((typelen + 3) & (~3)) - typelen; + slacklen = align_up (typelen, 8) - typelen; val = xmalloc (typelen + slacklen); back_to = make_cleanup (xfree, val); memcpy (val, contents, typelen); @@ -359,9 +347,9 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch, do_cleanups (back_to); } - /* Add 2 words for linkage space to the stack. */ - stack_dest = stack_dest - 8; - write_memory (stack_dest, two_zero_words, 8); + /* Add 16 bytes for linkage space to the stack. */ + stack_dest = stack_dest - 16; + write_memory (stack_dest, four_zero_words, 16); /* Update stack pointer. */ regcache_cooked_write_unsigned (regcache, TILEGX_SP_REGNUM, stack_dest); |