Hi I’ve started looking at the changes to the Darwin port that will be needed to support the AArch64 version of the OS. One of those is that it will be necessary to support poly-int machine modes where the number of coeffs > 1.
@richard, as discussed on irc, this removes the ‘IN_TARGET_CODE’ change from darwin.c. Actually, the specific routines using the machine mode sizes really *are* shared between ports and therefore are not really candidates for splitting into files stored per arch (although some of the other macho-pic code probably will be. This has been tested across the old 32b powerpc and i686 ports and on the latest x86-64 and my prototype arm64 one, but if there’s a goof I’d welcome any pointers tested as described, pushed to master, thanks Iain ==== The common code that selects suitable sections for literals needs to inspect the machine_mode. For some sub-targets that might be represented as a poly-int. There was a workaround in place that allowed for cases where the poly int had only one component. This removes the workaround and handles the cases where we care about the machine_mode size. gcc/ChangeLog: * config/darwin.c (IN_TARGET_CODE): Remove. (darwin_mergeable_constant_section): Handle poly-int machine modes. (machopic_select_rtx_section): Likewise. --- gcc/config/darwin.c | 62 ++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index d3c0af8a4b6..2c6da2b47c4 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -18,8 +18,6 @@ You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ -#define IN_TARGET_CODE 1 - #include "config.h" #include "system.h" #include "coretypes.h" @@ -1351,34 +1349,40 @@ darwin_mergeable_constant_section (tree exp, unsigned HOST_WIDE_INT align, bool zsize) { - machine_mode mode = DECL_MODE (exp); - unsigned int modesize = GET_MODE_BITSIZE (mode); - if (zsize) return darwin_sections[zobj_const_section]; - if (flag_merge_constants - && mode != VOIDmode - && mode != BLKmode - && modesize <= align - && align >= 8 - && align <= 256 - && (align & (align -1)) == 0) - { - tree size = TYPE_SIZE_UNIT (TREE_TYPE (exp)); + machine_mode mode = DECL_MODE (exp); + if (!flag_merge_constants + || mode == VOIDmode + || mode == BLKmode + || align < 8 + || align > 256 + || (align & (align -1)) != 0) + return readonly_data_section; - if (TREE_CODE (size) == INTEGER_CST) - { - if (wi::to_wide (size) == 4) - return darwin_sections[literal4_section]; - else if (wi::to_wide (size) == 8) - return darwin_sections[literal8_section]; - else if (HAVE_GAS_LITERAL16 - && TARGET_64BIT - && wi::to_wide (size) == 16) - return darwin_sections[literal16_section]; - } - } + /* This will ICE if the mode is not a constant size, but that is reasonable, + since one cannot put a variable-sized thing into a constant section, we + shouldn't be trying. */ + const unsigned int modesize = GET_MODE_BITSIZE (mode).to_constant (); + + if (modesize > align) + return readonly_data_section; + + tree size = TYPE_SIZE_UNIT (TREE_TYPE (exp)); + + if (TREE_CODE (size) != INTEGER_CST) + return readonly_data_section; + + unsigned isize = TREE_INT_CST_LOW (size); + if (isize == 4) + return darwin_sections[literal4_section]; + else if (isize == 8) + return darwin_sections[literal8_section]; + else if (HAVE_GAS_LITERAL16 + && TARGET_64BIT + && isize == 16) + return darwin_sections[literal16_section]; return readonly_data_section; } @@ -1747,19 +1751,19 @@ section * machopic_select_rtx_section (machine_mode mode, rtx x, unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) { - if (GET_MODE_SIZE (mode) == 8 + if (known_eq (GET_MODE_SIZE (mode), 8) && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_WIDE_INT || GET_CODE (x) == CONST_DOUBLE)) return darwin_sections[literal8_section]; - else if (GET_MODE_SIZE (mode) == 4 + else if (known_eq (GET_MODE_SIZE (mode), 4) && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_WIDE_INT || GET_CODE (x) == CONST_DOUBLE)) return darwin_sections[literal4_section]; else if (HAVE_GAS_LITERAL16 && TARGET_64BIT - && GET_MODE_SIZE (mode) == 16 + && known_eq (GET_MODE_SIZE (mode), 16) && (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_WIDE_INT || GET_CODE (x) == CONST_DOUBLE -- 2.24.1