SHA256
1
0
forked from pool/binutils
binutils/aarch64-alignment-frags.patch
Richard Biener f1bbe29a58 - Add s390x to gold_archs.
- Fix alignment frags for aarch64 (boo#1003846)
  aarch64-alignment-frags.patch

- Call ldconfig for libbfd

- Add s390x to gold_archs.

- Fix alignment frags for aarch64 (boo#1003846)
  aarch64-alignment-frags.patch

- Call ldconfig for libbfd

- Add s390x to gold_archs.

- Fix alignment frags for aarch64 (boo#1003846)
  aarch64-alignment-frags.patch

- Call ldconfig for libbfd

- Add s390x to gold_archs.

- Fix alignment frags for aarch64 (boo#1003846)
  aarch64-alignment-frags.patch

- Call ldconfig for libbfd

- Add s390x to gold_archs.

OBS-URL: https://build.opensuse.org/package/show/devel:gcc/binutils?expand=0&rev=226
2017-02-07 11:42:42 +00:00

111 lines
3.4 KiB
Diff

From 7ea12e5c3ad54da440c08f32da09534e63e515ca Mon Sep 17 00:00:00 2001
From: Nick Clifton <nickc@redhat.com>
Date: Fri, 5 Aug 2016 10:37:57 +0100
Subject: [PATCH] Fix the generation of alignment frags in code sections for
AArch64.
PR gas/20364
* config/tc-aarch64.c (s_ltorg): Change the mapping state after
aligning the frag.
(aarch64_init): Treat rs_align frags in code sections as
containing code, not data.
* testsuite/gas/aarch64/pr20364.s: New test.
* testsuite/gas/aarch64/pr20364.d: New test driver.
---
gas/ChangeLog | 10 ++++++++++
gas/config/tc-aarch64.c | 10 +++++++---
gas/testsuite/gas/aarch64/pr20364.d | 13 +++++++++++++
gas/testsuite/gas/aarch64/pr20364.s | 28 ++++++++++++++++++++++++++++
4 files changed, 58 insertions(+), 3 deletions(-)
create mode 100644 gas/testsuite/gas/aarch64/pr20364.d
create mode 100644 gas/testsuite/gas/aarch64/pr20364.s
Index: binutils-2.27/gas/config/tc-aarch64.c
===================================================================
--- binutils-2.27.orig/gas/config/tc-aarch64.c
+++ binutils-2.27/gas/config/tc-aarch64.c
@@ -1736,13 +1736,13 @@ s_ltorg (int ignored ATTRIBUTE_UNUSED)
if (pool == NULL || pool->symbol == NULL || pool->next_free_entry == 0)
continue;
- mapping_state (MAP_DATA);
-
/* Align pool as you have word accesses.
Only make a frag if we have to. */
if (!need_pass_2)
frag_align (align, 0, 0);
+ mapping_state (MAP_DATA);
+
record_alignment (now_seg, align);
sprintf (sym_name, "$$lit_\002%x", pool->id);
@@ -6373,11 +6373,15 @@ aarch64_init_frag (fragS * fragP, int ma
switch (fragP->fr_type)
{
- case rs_align:
case rs_align_test:
case rs_fill:
mapping_state_2 (MAP_DATA, max_chars);
break;
+ case rs_align:
+ /* PR 20364: We can get alignment frags in code sections,
+ so do not just assume that we should use the MAP_DATA state. */
+ mapping_state_2 (subseg_text_p (now_seg) ? MAP_INSN : MAP_DATA, max_chars);
+ break;
case rs_align_code:
mapping_state_2 (MAP_INSN, max_chars);
break;
Index: binutils-2.27/gas/testsuite/gas/aarch64/pr20364.d
===================================================================
--- /dev/null
+++ binutils-2.27/gas/testsuite/gas/aarch64/pr20364.d
@@ -0,0 +1,13 @@
+# Check that ".align <size>, <fill>" does not set the mapping state to DATA, causing unnecessary frag generation.
+#name: PR20364
+#objdump: -d
+
+.*: file format .*
+
+Disassembly of section \.vectors:
+
+0+000 <.*>:
+ 0: d2800000 mov x0, #0x0 // #0
+ 4: 94000000 bl 0 <plat_report_exception>
+ 8: 17fffffe b 0 <bl1_exceptions>
+
Index: binutils-2.27/gas/testsuite/gas/aarch64/pr20364.s
===================================================================
--- /dev/null
+++ binutils-2.27/gas/testsuite/gas/aarch64/pr20364.s
@@ -0,0 +1,28 @@
+ .macro vector_base label
+ .section .vectors, "ax"
+ .align 11, 0
+ \label:
+ .endm
+
+ .macro vector_entry label
+ .section .vectors, "ax"
+ .align 7, 0
+ \label:
+ .endm
+
+ .macro check_vector_size since
+ .if (. - \since) > (32 * 4)
+ .error "Vector exceeds 32 instructions"
+ .endif
+ .endm
+
+ .globl bl1_exceptions
+
+vector_base bl1_exceptions
+
+vector_entry SynchronousExceptionSP0
+ mov x0, #0x0
+ bl plat_report_exception
+ b SynchronousExceptionSP0
+ check_vector_size SynchronousExceptionSP0
+