aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2020-08-01 16:44:10 +0100
committerIain Sandoe <iain@sandoe.co.uk>2020-08-03 19:48:08 +0100
commit7ddee9cd99beb2c3603bf307d263c6fd9cc05e90 (patch)
tree667b8f093c0062333a2f6cdbf8477b7083d223d9 /gcc
parent76eb0434a40f44f3f9c8a81cf22f56bbeccad12a (diff)
downloadgcc-7ddee9cd99beb2c3603bf307d263c6fd9cc05e90.zip
gcc-7ddee9cd99beb2c3603bf307d263c6fd9cc05e90.tar.gz
gcc-7ddee9cd99beb2c3603bf307d263c6fd9cc05e90.tar.bz2
Darwin: Handle poly_int machine_modes.
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/darwin.c62
1 files changed, 33 insertions, 29 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index d3c0af8a..2c6da2b 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