Make ALIGN(x) behave as ALIGN(.,x)

Inside output sections, ALIGN(.,x) uses a section-relative value for
dot.  The unary ALIGN always used the absolute value of dot.

	* ldexp.c (align_dot_val): New function.
	(fold_unary <ALIGN_K, NEXT>): Use it.
This commit is contained in:
Alan Modra 2015-07-08 22:18:34 +09:30
parent 40f77f827b
commit a2c59f280d
2 changed files with 15 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2015-07-10 Alan Modra <amodra@gmail.com>
* ldexp.c (align_dot_val): New function.
(fold_unary <ALIGN_K, NEXT>): Use it.
2015-07-03 Kai Tietz <ktietz@redhat.com> 2015-07-03 Kai Tietz <ktietz@redhat.com>
PR ld/11539 PR ld/11539

View File

@ -257,6 +257,14 @@ new_rel_from_abs (bfd_vma value)
expld.result.section = s; expld.result.section = s;
} }
static void
align_dot_val (bfd_vma align)
{
bfd_vma base = expld.section->vma;
new_rel_from_abs (base + align_n (expld.dot - base, align));
}
/* New-function for the definedness hash table. */ /* New-function for the definedness hash table. */
static struct bfd_hash_entry * static struct bfd_hash_entry *
@ -335,7 +343,7 @@ fold_unary (etree_type *tree)
{ {
case ALIGN_K: case ALIGN_K:
if (expld.phase != lang_first_phase_enum) if (expld.phase != lang_first_phase_enum)
new_rel_from_abs (align_n (expld.dot, expld.result.value)); align_dot_val (expld.result.value);
else else
expld.result.valid_p = FALSE; expld.result.valid_p = FALSE;
break; break;
@ -365,7 +373,7 @@ fold_unary (etree_type *tree)
if (expld.phase != lang_first_phase_enum) if (expld.phase != lang_first_phase_enum)
{ {
make_abs (); make_abs ();
expld.result.value = align_n (expld.dot, expld.result.value); align_dot_val (expld.result.value);
} }
else else
expld.result.valid_p = FALSE; expld.result.valid_p = FALSE;