diff mbox

[aarch64] Fix target/70120

Message ID 56F03310.1030907@redhat.com
State New
Headers show

Commit Message

Richard Henderson March 21, 2016, 5:44 p.m. UTC
On 03/21/2016 06:40 AM, Jiong Wang wrote:
> On 17/03/16 19:17, Richard Henderson wrote:
>> PR target/70120
>>     * varasm.c (for_each_section): New.
>>     * varasm.h (for_each_section): Declare.
>>     * config/aarch64/aarch64.c (aarch64_align_code_section): New.
>>     (aarch64_asm_file_end): New.
>>     (TARGET_ASM_FILE_END): Redefine.
>
> Will ASM_OUTPUT_POOL_EPILOGUE be a better place to fix this issue? which can
> avoid the for_each_section traversal.

It's a good point.  I hadn't noticed this old (and currently unused) hook.
This alternate patch does in fact work.


r~
* config/aarch64/aarch64.c (aarch64_asm_output_pool_epilogue): New.
	* config/aarch64/aarch64-protos.h: Declare it.
	* config/aarch64/aarch64.h (ASM_OUTPUT_POOL_EPILOGUE): New.

Comments

Jiong Wang March 21, 2016, 10:37 p.m. UTC | #1
Richard Henderson writes:

> On 03/21/2016 06:40 AM, Jiong Wang wrote:
>> On 17/03/16 19:17, Richard Henderson wrote:
>>> PR target/70120
>>>     * varasm.c (for_each_section): New.
>>>     * varasm.h (for_each_section): Declare.
>>>     * config/aarch64/aarch64.c (aarch64_align_code_section): New.
>>>     (aarch64_asm_file_end): New.
>>>     (TARGET_ASM_FILE_END): Redefine.
>>
>> Will ASM_OUTPUT_POOL_EPILOGUE be a better place to fix this issue? which can
>> avoid the for_each_section traversal.
>
> It's a good point.  I hadn't noticed this old (and currently unused) hook.
> This alternate patch does in fact work.

Thanks, looks good to me, defer to maintainers.
Jeff Law March 25, 2016, 11:37 p.m. UTC | #2
On 03/21/2016 11:44 AM, Richard Henderson wrote:
> On 03/21/2016 06:40 AM, Jiong Wang wrote:
>> On 17/03/16 19:17, Richard Henderson wrote:
>>> PR target/70120
>>>     * varasm.c (for_each_section): New.
>>>     * varasm.h (for_each_section): Declare.
>>>     * config/aarch64/aarch64.c (aarch64_align_code_section): New.
>>>     (aarch64_asm_file_end): New.
>>>     (TARGET_ASM_FILE_END): Redefine.
>>
>> Will ASM_OUTPUT_POOL_EPILOGUE be a better place to fix this issue?
>> which can
>> avoid the for_each_section traversal.
>
> It's a good point.  I hadn't noticed this old (and currently unused) hook.
> This alternate patch does in fact work.
>
>
> r~
>
> z
>
>
> 	* config/aarch64/aarch64.c (aarch64_asm_output_pool_epilogue): New.
> 	* config/aarch64/aarch64-protos.h: Declare it.
> 	* config/aarch64/aarch64.h (ASM_OUTPUT_POOL_EPILOGUE): New.
Approved and installed (along with the 3 testcases from the original 
submission.

Thanks,
Jeff
diff mbox

Patch

diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index dced209..58c9d0d 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -429,4 +429,8 @@  bool extract_base_offset_in_addr (rtx mem, rtx *base, rtx *offset);
 bool aarch64_operands_ok_for_ldpstp (rtx *, bool, enum machine_mode);
 bool aarch64_operands_adjust_ok_for_ldpstp (rtx *, bool, enum machine_mode);
 extern bool aarch64_nopcrelative_literal_loads;
+
+extern void aarch64_asm_output_pool_epilogue (FILE *, const char *,
+					      tree, HOST_WIDE_INT);
+
 #endif /* GCC_AARCH64_PROTOS_H */
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index cf1239d..732ed70 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -5579,6 +5579,18 @@  aarch64_select_rtx_section (machine_mode mode,
   return default_elf_select_rtx_section (mode, x, align);
 }
 
+/* Implement ASM_OUTPUT_POOL_EPILOGUE.  */
+void
+aarch64_asm_output_pool_epilogue (FILE *f, const char *, tree,
+				  HOST_WIDE_INT offset)
+{
+  /* When using per-function literal pools, we must ensure that any code
+     section is aligned to the minimal instruction length, lest we get
+     errors from the assembler re "unaligned instructions".  */
+  if ((offset & 3) && aarch64_can_use_per_function_literal_pools_p ())
+    ASM_OUTPUT_ALIGN (f, 2);
+}
+
 /* Costs.  */
 
 /* Helper function for rtx cost calculation.  Strip a shift expression
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index ec96ce3..7750d1c 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -928,4 +928,6 @@  extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define EXTRA_SPECS						\
   { "asm_cpu_spec",		ASM_CPU_SPEC }
 
+#define ASM_OUTPUT_POOL_EPILOGUE  aarch64_asm_output_pool_epilogue
+
 #endif /* GCC_AARCH64_H */