avr: Fix bugs in org/align tracking.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 7 Oct 2015 19:47:38 +0000 (20:47 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 12 Oct 2015 08:43:11 +0000 (09:43 +0100)
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 fdd410ac7a07dfb47dcb992201000582a280d8b2, 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 137c83d69fad77677cc818593f9399caa777a0c5, 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.

binutils/ChangeLog
binutils/od-elf32_avr.c
gas/ChangeLog
gas/config/tc-avr.c
gas/testsuite/ChangeLog
gas/testsuite/gas/avr/avr-prop-1.d
gas/testsuite/gas/avr/avr-prop-1.s

index e40926b6a15b608990bbe65c4b46ca110248b363..ce3ac62596c161e4aebf170da952d4e5de87c48b 100644 (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>
 
index 5635964c1c0d52cd84a8595d6a173af8e5e3aac2..1abbc1f8f1b3e672be99ea6fdd7af1062be056c4 100644 (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;
         }
     }
index 90b358bd70f63dbc3b1d7be296992c784f63b327..e81117a0b628dfd0071a6cd53e97712244bec9c1 100644 (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
index 09eea48f9e736743ec9de1cb387f68200d15a2c9..252b1a2fc454573647e77259c00ac0bd001ca338 100644 (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);
index 814d0a68a310f5dba70c2545f6c6824e6455a91a..54bb989e70faf2fe513d560450912286a33536f4 100644 (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.
index b140ae6fd33a4640f870f70a110e2d988b55460b..9cbbd969629ef4f5797da750a77ba4fee27b9d40 100644 (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
 
index 6e50cf1649c1d56c9df9c09f0a04e6cbf404c0d2..1949216d16d0e4a627adcb522fd7b9999328bec3 100644 (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