[Sync] Sync patch from openeuler/gcc
Sync patch from openeuler/gcc - 20220908 (cherry picked from commit 7709b3554c276ea273838e29fa6db318ca41f187)
This commit is contained in:
parent
140c60bd01
commit
60d1565517
379
0047-DFE-Fix-the-bug-caused-by-inconsistent-types.patch
Normal file
379
0047-DFE-Fix-the-bug-caused-by-inconsistent-types.patch
Normal file
@ -0,0 +1,379 @@
|
||||
From 8f51c8c83355cb1b69553e582fb512c6e37b71f5 Mon Sep 17 00:00:00 2001
|
||||
From: Mingchuan Wu <wumingchuan1992@foxmail.com>
|
||||
Date: Thu, 18 Aug 2022 17:15:08 +0800
|
||||
Subject: [PATCH] [DFE] Fix the bug caused by inconsistent types: 1. Update
|
||||
some functions to fix the bug caused by inconsistent base and node types.
|
||||
|
||||
Also we added 3 dejaGNU test cases.
|
||||
---
|
||||
gcc/ipa-struct-reorg/ipa-struct-reorg.c | 57 ++++++++-----
|
||||
.../gcc.dg/struct/dfe_extr_board_init.c | 77 +++++++++++++++++
|
||||
gcc/testsuite/gcc.dg/struct/dfe_extr_claw.c | 77 +++++++++++++++++
|
||||
.../gcc.dg/struct/dfe_extr_mv_udc_core.c | 82 +++++++++++++++++++
|
||||
4 files changed, 273 insertions(+), 20 deletions(-)
|
||||
create mode 100644 gcc/testsuite/gcc.dg/struct/dfe_extr_board_init.c
|
||||
create mode 100644 gcc/testsuite/gcc.dg/struct/dfe_extr_claw.c
|
||||
create mode 100644 gcc/testsuite/gcc.dg/struct/dfe_extr_mv_udc_core.c
|
||||
|
||||
diff --git a/gcc/ipa-struct-reorg/ipa-struct-reorg.c b/gcc/ipa-struct-reorg/ipa-struct-reorg.c
|
||||
index 00dc4bf1d..8d3da3540 100644
|
||||
--- a/gcc/ipa-struct-reorg/ipa-struct-reorg.c
|
||||
+++ b/gcc/ipa-struct-reorg/ipa-struct-reorg.c
|
||||
@@ -3284,33 +3284,31 @@ ipa_struct_reorg::find_vars (gimple *stmt)
|
||||
}
|
||||
}
|
||||
|
||||
-/* Update field_access in srfield. */
|
||||
-
|
||||
-static void
|
||||
-update_field_access (tree node, tree op, unsigned access, void *data)
|
||||
+static HOST_WIDE_INT
|
||||
+get_offset (tree op, HOST_WIDE_INT offset)
|
||||
{
|
||||
- HOST_WIDE_INT offset = 0;
|
||||
switch (TREE_CODE (op))
|
||||
{
|
||||
case COMPONENT_REF:
|
||||
{
|
||||
- offset = int_byte_position (TREE_OPERAND (op, 1));
|
||||
- break;
|
||||
+ return int_byte_position (TREE_OPERAND (op, 1));
|
||||
}
|
||||
case MEM_REF:
|
||||
{
|
||||
- offset = tree_to_uhwi (TREE_OPERAND (op, 1));
|
||||
- break;
|
||||
+ return tree_to_uhwi (TREE_OPERAND (op, 1));
|
||||
}
|
||||
default:
|
||||
- return;
|
||||
+ return offset;
|
||||
}
|
||||
- tree base = node;
|
||||
- get_base (base, node);
|
||||
- srdecl *this_srdecl = ((ipa_struct_reorg *)data)->find_decl (base);
|
||||
- if (this_srdecl == NULL)
|
||||
- return;
|
||||
- srtype *this_srtype = this_srdecl->type;
|
||||
+ return offset;
|
||||
+}
|
||||
+
|
||||
+/* Record field access. */
|
||||
+static void
|
||||
+record_field_access (tree type, HOST_WIDE_INT offset,
|
||||
+ unsigned access, void *data)
|
||||
+{
|
||||
+ srtype *this_srtype = ((ipa_struct_reorg *)data)->find_type (type);
|
||||
if (this_srtype == NULL)
|
||||
return;
|
||||
srfield *this_srfield = this_srtype->find_field (offset);
|
||||
@@ -3321,12 +3319,33 @@ update_field_access (tree node, tree op, unsigned access, void *data)
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
{
|
||||
fprintf (dump_file, "record field access %d:", access);
|
||||
- print_generic_expr (dump_file, this_srtype->type);
|
||||
+ print_generic_expr (dump_file, type);
|
||||
fprintf (dump_file, " field:");
|
||||
print_generic_expr (dump_file, this_srfield->fielddecl);
|
||||
fprintf (dump_file, "\n");
|
||||
}
|
||||
return;
|
||||
+
|
||||
+}
|
||||
+
|
||||
+/* Update field_access in srfield. */
|
||||
+
|
||||
+static void
|
||||
+update_field_access (tree node, tree op, unsigned access, void *data)
|
||||
+{
|
||||
+ HOST_WIDE_INT offset = 0;
|
||||
+ offset = get_offset (op, offset);
|
||||
+ tree node_type = inner_type (TREE_TYPE (node));
|
||||
+ record_field_access (node_type, offset, access, data);
|
||||
+ tree base = node;
|
||||
+ get_base (base, node);
|
||||
+ tree base_type = inner_type (TREE_TYPE (base));
|
||||
+ if (!types_compatible_p (base_type, node_type))
|
||||
+ {
|
||||
+ record_field_access (base_type, get_offset (node, offset),
|
||||
+ access, data);
|
||||
+ }
|
||||
+ return;
|
||||
}
|
||||
|
||||
/* A callback for walk_stmt_load_store_ops to visit store. */
|
||||
@@ -3373,8 +3392,7 @@ ipa_struct_reorg::remove_dead_field_stmt (tree lhs)
|
||||
return false;
|
||||
if (f == NULL)
|
||||
return false;
|
||||
- if (f->newfield[0] == NULL
|
||||
- && (f->field_access & WRITE_FIELD))
|
||||
+ if (f->newfield[0] == NULL)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -5927,7 +5945,6 @@ ipa_struct_reorg::rewrite_assign (gassign *stmt, gimple_stmt_iterator *gsi)
|
||||
fprintf (dump_file, "To: \n");
|
||||
print_gimple_stmt (dump_file, stmt, 0);
|
||||
}
|
||||
- return false;
|
||||
}
|
||||
|
||||
if (gimple_clobber_p (stmt))
|
||||
diff --git a/gcc/testsuite/gcc.dg/struct/dfe_extr_board_init.c b/gcc/testsuite/gcc.dg/struct/dfe_extr_board_init.c
|
||||
new file mode 100644
|
||||
index 000000000..4e52564b6
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.dg/struct/dfe_extr_board_init.c
|
||||
@@ -0,0 +1,77 @@
|
||||
+/* { dg-do compile} */
|
||||
+
|
||||
+#define NULL ((void*)0)
|
||||
+typedef unsigned long size_t;
|
||||
+typedef long intptr_t;
|
||||
+typedef unsigned long uintptr_t;
|
||||
+typedef long scalar_t__;
|
||||
+typedef int bool;
|
||||
+#define false 0
|
||||
+#define true 1
|
||||
+
|
||||
+typedef struct TYPE_5__ TYPE_2__;
|
||||
+typedef struct TYPE_4__ TYPE_1__;
|
||||
+
|
||||
+struct TYPE_4__
|
||||
+{
|
||||
+ int Pin;
|
||||
+ int Pull;
|
||||
+ int Mode;
|
||||
+ int Speed;
|
||||
+};
|
||||
+
|
||||
+struct TYPE_5__
|
||||
+{
|
||||
+ int MEMRMP;
|
||||
+};
|
||||
+typedef TYPE_1__ GPIO_InitTypeDef;
|
||||
+
|
||||
+int BT_RST_PIN;
|
||||
+int BT_RST_PORT;
|
||||
+int CONN_POS10_PIN;
|
||||
+int CONN_POS10_PORT;
|
||||
+int GPIO_HIGH (int, int);
|
||||
+int GPIO_MODE_INPUT;
|
||||
+int GPIO_MODE_OUTPUT_PP;
|
||||
+int GPIO_NOPULL;
|
||||
+int GPIO_PULLUP;
|
||||
+int GPIO_SPEED_FREQ_LOW;
|
||||
+int HAL_GPIO_Init (int, TYPE_1__ *);
|
||||
+scalar_t__ IS_GPIO_RESET (int, int);
|
||||
+TYPE_2__ *SYSCFG;
|
||||
+int __HAL_RCC_GPIOB_CLK_ENABLE ();
|
||||
+int __HAL_RCC_GPIOC_CLK_ENABLE ();
|
||||
+
|
||||
+__attribute__((used)) static void
|
||||
+LBF_DFU_If_Needed (void)
|
||||
+{
|
||||
+ GPIO_InitTypeDef GPIO_InitStruct;
|
||||
+ __HAL_RCC_GPIOC_CLK_ENABLE ();
|
||||
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
+ GPIO_InitStruct.Pin = BT_RST_PIN;
|
||||
+ HAL_GPIO_Init (BT_RST_PORT, &GPIO_InitStruct);
|
||||
+
|
||||
+ GPIO_HIGH (BT_RST_PORT, BT_RST_PIN);
|
||||
+ __HAL_RCC_GPIOB_CLK_ENABLE ();
|
||||
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||
+ GPIO_InitStruct.Pin = CONN_POS10_PIN;
|
||||
+ HAL_GPIO_Init (CONN_POS10_PORT, &GPIO_InitStruct);
|
||||
+
|
||||
+ if (IS_GPIO_RESET (CONN_POS10_PORT, CONN_POS10_PIN))
|
||||
+ {
|
||||
+ SYSCFG->MEMRMP = 0x00000001;
|
||||
+ asm (
|
||||
+ "LDR R0, =0x000000\n\t"
|
||||
+ "LDR SP, [R0, #0]\n\t"
|
||||
+ );
|
||||
+ asm (
|
||||
+ "LDR R0, [R0, #0]\n\t"
|
||||
+ "BX R0\n\t"
|
||||
+ );
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-ipa-dump-times "Dead field elimination" 0 "struct_layout" } } */
|
||||
diff --git a/gcc/testsuite/gcc.dg/struct/dfe_extr_claw.c b/gcc/testsuite/gcc.dg/struct/dfe_extr_claw.c
|
||||
new file mode 100644
|
||||
index 000000000..894e9f460
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.dg/struct/dfe_extr_claw.c
|
||||
@@ -0,0 +1,77 @@
|
||||
+/* { dg-do compile} */
|
||||
+
|
||||
+#define NULL ((void*)0)
|
||||
+typedef unsigned long size_t;
|
||||
+typedef long intptr_t;
|
||||
+typedef unsigned long uintptr_t;
|
||||
+typedef long scalar_t__;
|
||||
+typedef int bool;
|
||||
+#define false 0
|
||||
+#define true 1
|
||||
+
|
||||
+typedef struct TYPE_2__ TYPE_1__;
|
||||
+
|
||||
+struct net_device
|
||||
+{
|
||||
+ struct claw_privbk* ml_priv;
|
||||
+};
|
||||
+struct clawctl
|
||||
+{
|
||||
+ int linkid;
|
||||
+};
|
||||
+struct claw_privbk
|
||||
+{
|
||||
+ int system_validate_comp;
|
||||
+ TYPE_1__* p_env;
|
||||
+ int ctl_bk;
|
||||
+};
|
||||
+typedef int __u8;
|
||||
+struct TYPE_2__
|
||||
+{
|
||||
+ scalar_t__ packing;
|
||||
+ int api_type;
|
||||
+};
|
||||
+
|
||||
+int CLAW_DBF_TEXT (int, int, char*);
|
||||
+int CONNECTION_REQUEST;
|
||||
+int HOST_APPL_NAME;
|
||||
+scalar_t__ PACKING_ASK;
|
||||
+scalar_t__ PACK_SEND;
|
||||
+int WS_APPL_NAME_IP_NAME;
|
||||
+int WS_APPL_NAME_PACKED;
|
||||
+int claw_send_control (struct net_device*, int, int, int, int, int, int);
|
||||
+int setup;
|
||||
+
|
||||
+__attribute__((used)) static int
|
||||
+claw_snd_conn_req (struct net_device *dev, __u8 link)
|
||||
+{
|
||||
+ int rc;
|
||||
+ struct claw_privbk *privptr = dev->ml_priv;
|
||||
+ struct clawctl *p_ctl;
|
||||
+ CLAW_DBF_TEXT (2, setup, "snd_conn");
|
||||
+ rc = 1;
|
||||
+ p_ctl = (struct clawctl *)&privptr->ctl_bk;
|
||||
+ p_ctl->linkid = link;
|
||||
+ if (privptr->system_validate_comp == 0x00)
|
||||
+ {
|
||||
+ return rc;
|
||||
+ }
|
||||
+ if (privptr->p_env->packing == PACKING_ASK)
|
||||
+ {
|
||||
+ rc = claw_send_control (dev, CONNECTION_REQUEST, 0, 0, 0,
|
||||
+ WS_APPL_NAME_PACKED, WS_APPL_NAME_PACKED);
|
||||
+ }
|
||||
+ if (privptr->p_env->packing == PACK_SEND)
|
||||
+ {
|
||||
+ rc = claw_send_control (dev, CONNECTION_REQUEST, 0, 0, 0,
|
||||
+ WS_APPL_NAME_IP_NAME, WS_APPL_NAME_IP_NAME);
|
||||
+ }
|
||||
+ if (privptr->p_env->packing == 0)
|
||||
+ {
|
||||
+ rc = claw_send_control (dev, CONNECTION_REQUEST, 0, 0, 0,
|
||||
+ HOST_APPL_NAME, privptr->p_env->api_type);
|
||||
+ }
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-ipa-dump-times "Dead field elimination" 1 "struct_layout" } } */
|
||||
diff --git a/gcc/testsuite/gcc.dg/struct/dfe_extr_mv_udc_core.c b/gcc/testsuite/gcc.dg/struct/dfe_extr_mv_udc_core.c
|
||||
new file mode 100644
|
||||
index 000000000..9801f87f1
|
||||
--- /dev/null
|
||||
+++ b/gcc/testsuite/gcc.dg/struct/dfe_extr_mv_udc_core.c
|
||||
@@ -0,0 +1,82 @@
|
||||
+/* { dg-do compile} */
|
||||
+
|
||||
+#define NULL ((void*)0)
|
||||
+typedef unsigned long size_t;
|
||||
+typedef long intptr_t;
|
||||
+typedef unsigned long uintptr_t;
|
||||
+typedef long scalar_t__;
|
||||
+typedef int bool;
|
||||
+#define false 0
|
||||
+#define true 1
|
||||
+
|
||||
+typedef struct TYPE_4__ TYPE_2__;
|
||||
+typedef struct TYPE_3__ TYPE_1__;
|
||||
+typedef int u32;
|
||||
+
|
||||
+struct mv_udc
|
||||
+{
|
||||
+ TYPE_2__ *op_regs;
|
||||
+ TYPE_1__ *ep_dqh;
|
||||
+ struct mv_ep *eps;
|
||||
+};
|
||||
+
|
||||
+struct mv_ep
|
||||
+{
|
||||
+ TYPE_1__ *dqh;
|
||||
+ struct mv_udc *udc;
|
||||
+};
|
||||
+
|
||||
+struct TYPE_4__
|
||||
+{
|
||||
+ int *epctrlx;
|
||||
+};
|
||||
+
|
||||
+struct TYPE_3__
|
||||
+{
|
||||
+ int max_packet_length;
|
||||
+ int next_dtd_ptr;
|
||||
+};
|
||||
+
|
||||
+int EP0_MAX_PKT_SIZE;
|
||||
+int EPCTRL_RX_ENABLE;
|
||||
+int EPCTRL_RX_EP_TYPE_SHIFT;
|
||||
+int EPCTRL_TX_ENABLE;
|
||||
+int EPCTRL_TX_EP_TYPE_SHIFT;
|
||||
+int EP_QUEUE_HEAD_IOS;
|
||||
+int EP_QUEUE_HEAD_MAX_PKT_LEN_POS;
|
||||
+int EP_QUEUE_HEAD_NEXT_TERMINATE;
|
||||
+int USB_ENDPOINT_XFER_CONTROL;
|
||||
+int readl (int *);
|
||||
+int writel (int, int *);
|
||||
+
|
||||
+__attribute__((used)) static void
|
||||
+ep0_reset (struct mv_udc *udc)
|
||||
+{
|
||||
+ struct mv_ep *ep;
|
||||
+ u32 epctrlx;
|
||||
+ int i = 0;
|
||||
+ for (i = 0; i < 2; i++)
|
||||
+ {
|
||||
+ ep = &udc->eps[i];
|
||||
+ ep->udc = udc;
|
||||
+ ep->dqh = &udc->ep_dqh[i];
|
||||
+ ep->dqh->max_packet_length =
|
||||
+ (EP0_MAX_PKT_SIZE << EP_QUEUE_HEAD_MAX_PKT_LEN_POS)
|
||||
+ | EP_QUEUE_HEAD_IOS;
|
||||
+ ep->dqh->next_dtd_ptr = EP_QUEUE_HEAD_NEXT_TERMINATE;
|
||||
+ epctrlx = readl (&udc->op_regs->epctrlx[0]);
|
||||
+ if (i)
|
||||
+ {
|
||||
+ epctrlx |= EPCTRL_TX_ENABLE
|
||||
+ | (USB_ENDPOINT_XFER_CONTROL << EPCTRL_TX_EP_TYPE_SHIFT);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ epctrlx |= EPCTRL_RX_ENABLE
|
||||
+ | (USB_ENDPOINT_XFER_CONTROL << EPCTRL_RX_EP_TYPE_SHIFT);
|
||||
+ }
|
||||
+ writel (epctrlx, &udc->op_regs->epctrlx[0]);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-ipa-dump-times "Dead field elimination" 2 "struct_layout" } } */
|
||||
--
|
||||
2.33.0
|
||||
|
||||
12
gcc.spec
12
gcc.spec
@ -61,7 +61,7 @@
|
||||
Summary: Various compilers (C, C++, Objective-C, ...)
|
||||
Name: gcc
|
||||
Version: %{gcc_version}
|
||||
Release: 14
|
||||
Release: 15
|
||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
|
||||
URL: https://gcc.gnu.org
|
||||
|
||||
@ -160,6 +160,7 @@ Patch41: 0041-Backport-Register-sysroot-in-the-driver-switches-tab.patch
|
||||
Patch42: 0042-DFE-Fix-bugs.patch
|
||||
Patch45: 0045-Transposed-SLP-Enable-Transposed-SLP.patch
|
||||
Patch46: 0046-ArrayWidenCompare-Add-a-new-optimization-for-array-c.patch
|
||||
Patch47: 0047-DFE-Fix-the-bug-caused-by-inconsistent-types.patch
|
||||
|
||||
%global gcc_target_platform %{_arch}-linux-gnu
|
||||
|
||||
@ -660,6 +661,7 @@ not stable, so plugins must be rebuilt any time GCC is updated.
|
||||
%patch42 -p1
|
||||
%patch45 -p1
|
||||
%patch46 -p1
|
||||
%patch47 -p1
|
||||
|
||||
|
||||
%build
|
||||
@ -2680,7 +2682,13 @@ end
|
||||
%doc rpm.doc/changelogs/libcc1/ChangeLog*
|
||||
|
||||
%changelog
|
||||
* Mon Aug 16 2022 benniaobufeijiushiji <linda7@huawei.com> - 10.3.1-14
|
||||
* Thu Sep 8 2022 benniaobufeijiushiji <linda7@huawei.com> - 10.3.1-15
|
||||
- Type:Sync
|
||||
- ID:NA
|
||||
- SUG:NA
|
||||
- DESC:Sync patch from openeuler/gcc
|
||||
|
||||
* Tue Aug 16 2022 benniaobufeijiushiji <linda7@huawei.com> - 10.3.1-14
|
||||
- Type:Revert
|
||||
- ID:NA
|
||||
- SUG:NA
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user