avr: Fix bugs in org/align tracking.

This commit fixes a few issues in the mechanism for passing information
about ".org" and ".align" directives from the assembler to the linker,
used by the avr target.

In the original commit fdd410ac7a, there
were some mistakes when writing out information about ".align"
directives:
  - An align with fill does not write out its information correctly, the
    fill data overwrites the alignment data.
  - Each alignment directive is recorded at the location where the
    previous alignment directive should be recorded, the first alignment
    directive is discarded.

In commit 137c83d69f, the data produced by
objdump is not correct:
   - It's miss-aligned due to a missing whitespace.
   - The fill data for align with fill records is not displayed
     correctly.

All of the above issues are addressed in this commit, and the test is
improved to cover these cases.

binutils/ChangeLog:

	* od-elf32_avr.c (elf32_avr_dump_avr_prop): Fix printing of align
	specific data, fix formatting for align and org data.

gas/ChangeLog:

	* config/tc-avr.c (avr_output_property_record): Fix overwrite bug
	for align and fill records.
	(avr_handle_align): Record fill information for align frags.
	(create_record_for_frag): Add next frag assertion, use correct
	address for align records.

gas/testsuite/ChangeLog:

	* gas/avr/avr-prop-1.s: Use fill in some cases.
	* gas/avr/avr-prop-1.d: Update expected results.
This commit is contained in:
Andrew Burgess 2015-10-07 20:47:38 +01:00
parent ef05be83b7
commit 431ff0756a
7 changed files with 41 additions and 16 deletions

View File

@ -1,3 +1,8 @@
2015-10-12 Andrew Burgess <andrew.burgess@embecosm.com>
* od-elf32_avr.c (elf32_avr_dump_avr_prop): Fix printing of align
specific data, fix formatting for align and org data.
2015-09-01 Claudiu Zissulescu <claziss@synopsys.com>
Cupertino Miranda <cmiranda@synopsys.com>

View File

@ -271,13 +271,13 @@ elf32_avr_dump_avr_prop (bfd *abfd)
r_list->records [i].data.org.fill);
break;
case RECORD_ALIGN:
printf (" Align: %#08lx\n",
printf (" Align: %#08lx\n",
r_list->records [i].data.align.bytes);
break;
case RECORD_ALIGN_AND_FILL:
printf (" Align: %#08lx, Fill: %#08lx\n",
printf (" Align: %#08lx, Fill: %#08lx\n",
r_list->records [i].data.align.bytes,
r_list->records [i].data.org.fill);
r_list->records [i].data.align.fill);
break;
}
}

View File

@ -1,3 +1,11 @@
2015-10-12 Andrew Burgess <andrew.burgess@embecosm.com>
* config/tc-avr.c (avr_output_property_record): Fix overwrite bug
for align and fill records.
(avr_handle_align): Record fill information for align frags.
(create_record_for_frag): Add next frag assertion, use correct
address for align records.
2015-10-10 Alan Modra <amodra@gmail.com>
PR gas/19113

View File

@ -1993,7 +1993,7 @@ avr_output_property_record (char * const frag_base, char *frag_ptr,
case RECORD_ALIGN_AND_FILL:
md_number_to_chars (frag_ptr, record->data.align.bytes, 4);
md_number_to_chars (frag_ptr, record->data.align.fill, 4);
md_number_to_chars (frag_ptr + 4, record->data.align.fill, 4);
frag_ptr += 8;
break;
@ -2038,11 +2038,14 @@ avr_handle_align (fragS *fragP)
alignment mechanism. */
if ((fragP->fr_type == rs_align
|| fragP->fr_type == rs_align_code)
&& fragP->fr_address > 0
&& fragP->fr_offset > 0)
{
char *p = fragP->fr_literal + fragP->fr_fix;
fragP->tc_frag_data.is_align = TRUE;
fragP->tc_frag_data.alignment = fragP->fr_offset;
fragP->tc_frag_data.fill = *p;
fragP->tc_frag_data.has_fill = (fragP->tc_frag_data.fill != 0);
}
if (fragP->fr_type == rs_org && fragP->fr_offset > 0)
@ -2078,6 +2081,7 @@ create_record_for_frag (segT sec, fragS *fragP)
prop_rec_link = xmalloc (sizeof (struct avr_property_record_link));
memset (prop_rec_link, 0, sizeof (*prop_rec_link));
gas_assert (fragP->fr_next != NULL);
if (fragP->tc_frag_data.is_org)
{
@ -2094,7 +2098,7 @@ create_record_for_frag (segT sec, fragS *fragP)
}
else
{
prop_rec_link->record.offset = fragP->fr_address;
prop_rec_link->record.offset = fragP->fr_next->fr_address;
prop_rec_link->record.section = sec;
gas_assert (fragP->tc_frag_data.is_align);

View File

@ -1,3 +1,8 @@
2015-10-12 Andrew Burgess <andrew.burgess@embecosm.com>
* gas/avr/avr-prop-1.s: Use fill in some cases.
* gas/avr/avr-prop-1.d: Update expected results.
2015-10-07 Claudiu Zissulescu <claziss@synopsys.com>
* gas/arc/adc.s: Update test for ARCv1/ARCv2.

View File

@ -12,15 +12,18 @@ Contents of `\.avr\.prop' section:
Flags: 0
0 ORG @ \.text\.1 \+ 0x000020 \(0x000020\)
1 ORG @ \.text\.1 \+ 0x000044 \(0x000044\)
1 ORG\+FILL @ \.text\.1 \+ 0x000044 \(0x000044\)
Fill: 0x000005
2 ORG @ \.text\.2 \+ 0x000020 \(0x000020\)
3 ALIGN @ \.text\.2 \+ 0x000020 \(0x000020\)
Align: 0x000004
4 ALIGN @ \.text\.2 \+ 0x000030 \(0x000030\)
Align: 0x000004
3 ALIGN @ \.text\.2 \+ 0x000030 \(0x000030\)
Align: 0x000004
4 ALIGN\+FILL @ \.text\.2 \+ 0x000040 \(0x000040\)
Align: 0x000004, Fill: 0x000003
5 ORG @ \.text\.2 \+ 0x000200 \(0x000200\)
6 ALIGN @ \.text\.2 \+ 0x000200 \(0x000200\)
Align: 0x000004
6 ALIGN @ \.text\.2 \+ 0x000210 \(0x000210\)
Align: 0x000004
7 ALIGN @ \.text\.3 \+ 0x000100 \(0x000100\)
Align: 0x000008
Align: 0x000008
8 ALIGN @ \.text\.3 \+ 0x000200 \(0x000200\)
Align: 0x000008

View File

@ -3,7 +3,7 @@
_start:
.org 0x20
nop
.org 0x44
.org 0x44,5
nop
@ -14,7 +14,7 @@ text2:
nop
.align 4
nop
.align 4
.align 4,3
nop
.org 0x200
nop