diff mbox series

[AIX] Fix private_read_only_data_section definition

Message ID CAGWvnykXigveP5os13kmPXCKQ0ShUrKYp=XkDM5xWwf_zEXPuA@mail.gmail.com
State New
Headers show
Series [AIX] Fix private_read_only_data_section definition | expand

Commit Message

David Edelsohn April 5, 2019, 3:38 p.m. UTC
When not using -fdata-sections or when there is no containing name,
GCC falls back to a default section name.  Because AIX uses XCOFF, it
always has generated it's own section (CSECT) names (based on the
filename) and not using the GCC defaults.

unicode.org icu code has elicited behavior from the GCC AIX backend
that generates invalid code

https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/tzfmt.cpp

Essentially

extern "C++" { namespace icu_64 {
static const UChar TZID_GMT[] = {0x0045, 0x0074, 0x0063, 0x002F,
0x0047, 0x004D, 0x0054, 0}; // Etc/GMT

selects a read only section whose name matches a read write section
name (a CSECT with [RO] mapping matches a CSECT with [RW] mapping).
The AIX linker generates an error for this combination.

The current algorithm creates a single private data section name,
e.g., "_tzfmt.rw_" and uses the one string for the names of both the
read write and read only private data sections

_tzfmt.rw_[RW]
_tzfmt.rw_[RO]

Apparently this combination never has been elicited previously over
the 20+ years of the port.  The most expedient solution is to generate
a separate name for private read only data.

The GCC XCOFF stabs debugging information will not be correct for
this, but, if one examines the current GCC xcoffout.c logic, it never
has been correct and always assumed that the section was read write.
The focus for AIX is DWARF debugging and this section rarely, if ever,
has been emitted.

Another solution would be to place private read only data in the
private read write data section when the -fdata-section logic is not
active or not triggered.

Thanks, David

Bootstrapped on powerpc-ibm-aix7.2.0.0.

* xcoffout.h (xcoff_private_rodata_section_name): Declare.
* xcoffout.c (xcoff_private_rodata_section_name): Define.
* config/rs6000/rs6000.c (rs6000_xcoff_asm_init_sections): Create
read_only_private_data_section using
xcoff_private_rodata_section_name.
(rs6000_xcoff_file_start): Generate xcoff_private_rodata_section_name.
diff mbox series

Patch

Index: xcoffout.c
===================================================================
--- xcoffout.c  (revision 270165)
+++ xcoffout.c  (working copy)
@@ -64,6 +64,7 @@  static const char *xcoff_current_function_file;

 char *xcoff_bss_section_name;
 char *xcoff_private_data_section_name;
+char *xcoff_private_rodata_section_name;
 char *xcoff_tls_data_section_name;
 char *xcoff_tbss_section_name;
 char *xcoff_read_only_section_name;
Index: xcoffout.h
===================================================================
--- xcoffout.h  (revision 270165)
+++ xcoffout.h  (working copy)
@@ -127,6 +127,7 @@  extern const char *xcoff_current_include_file;

 extern char *xcoff_bss_section_name;
 extern char *xcoff_private_data_section_name;
+extern char *xcoff_private_rodata_section_name;
 extern char *xcoff_tls_data_section_name;
 extern char *xcoff_tbss_section_name;
 extern char *xcoff_read_only_section_name;
Index: config/rs6000/rs6000.c
===================================================================
--- config/rs6000/rs6000.c      (revision 270165)
+++ config/rs6000/rs6000.c      (working copy)
@@ -33866,6 +33866,10 @@  rs6000_xcoff_asm_init_sections (void)
                           rs6000_xcoff_output_readwrite_section_asm_op,
                           &xcoff_private_data_section_name);

+  read_only_private_data_section
+    = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
+                          &xcoff_private_rodata_section_name);
+
   tls_data_section
     = get_unnamed_section (SECTION_TLS,
                           rs6000_xcoff_output_tls_section_asm_op,
@@ -33876,10 +33880,6 @@  rs6000_xcoff_asm_init_sections (void)
                           rs6000_xcoff_output_tls_section_asm_op,
                           &xcoff_private_data_section_name);

-  read_only_private_data_section
-    = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op,
-                          &xcoff_private_data_section_name);
-
   toc_section
     = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL);

@@ -34060,6 +34060,8 @@  rs6000_xcoff_file_start (void)
                           main_input_filename, ".bss_");
   rs6000_gen_section_name (&xcoff_private_data_section_name,
                           main_input_filename, ".rw_");
+  rs6000_gen_section_name (&xcoff_private_rodata_section_name,
+                          main_input_filename, ".rop_");
   rs6000_gen_section_name (&xcoff_read_only_section_name,
                           main_input_filename, ".ro_");
   rs6000_gen_section_name (&xcoff_tls_data_section_name,