From patchwork Sat Jan 27 20:41:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 1891815 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=Tyd72YcT; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TMmgy0nX4z23fD for ; Sun, 28 Jan 2024 07:41:48 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CEED23858414 for ; Sat, 27 Jan 2024 20:41:44 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-qv1-xf2a.google.com (mail-qv1-xf2a.google.com [IPv6:2607:f8b0:4864:20::f2a]) by sourceware.org (Postfix) with ESMTPS id 0E2323858D28 for ; Sat, 27 Jan 2024 20:41:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0E2323858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0E2323858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::f2a ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706388089; cv=none; b=QeE85JJM+wV+7n1eHeaJAZISNWq8yEJtHAvD0UKjq4ml3XZhS/oOUWmMh2HwaG5FgBKKMai1R4NwXear7mVVPAM0JLaVHr7LhJN49CSNySMVAQ1JkJ9qPcuW9fHwAIE6LSpmskQnRR5tjdlJszUMwXBldVRdwInP2mMdnpd+X40= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706388089; c=relaxed/simple; bh=w3UgSH+7HyMBlZTnWM3YxfHBRWalt1nTb6lHsZkGmi4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Zi5FNlVB32EabU+ShE/XPtZEkgbN+IQA4QNrRCVXzOWYXIG+QBCg7ObVeoW7XNpwG6SmUffg2eD5oAXd5X+DYqXjwK7ieS5akKG0dsHhi9M5wtdFnAQx6lANCRVrs/EdLTA8ZxIu78/+ul82jC5RFt03uXjpzkiuzomrQ/2QjaE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-qv1-xf2a.google.com with SMTP id 6a1803df08f44-68c37bf73aaso11657326d6.2 for ; Sat, 27 Jan 2024 12:41:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706388086; x=1706992886; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=DgtjIk3IK9Wnf+8Fz31C6CYFTrbU+Z2WjyPv5RbliXY=; b=Tyd72YcTBa83/m4xLMa2bJ+wtNgUMYPJk/21u1t2NrHivWz1meLidwXxcb+k8CVXy/ /gCOQjDVYPAr+g7+r98Q5Sp/Nf2VFUPRaK70aXzExACLOBmPDM7vcv/IK+iliEEuV6cS q6iSFsKXvlke9tFCk2D2pTEQO7Qmn0ngfId2Zmi3wBcOaZpkXHKHNx++u8k6gqx7l35p sXl1OHMfIcZ7rQa02hO8qmaO6cDfbi6hVSYbtaxz9UvfEWhzk9g/Uh7/+QQivA1kZKrf 4M07ar4pceyPr8y7G8PqVx5ni3Ql9WnK1kwieig4KtfwHRBudoDR0tdEbU5Pr378MbFf m2yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706388086; x=1706992886; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=DgtjIk3IK9Wnf+8Fz31C6CYFTrbU+Z2WjyPv5RbliXY=; b=rLiNAudiUGJTNZzw8qO8qyWL7opWQHj1KiZWDPYTtwZxDZxpioysuKgyaLxvtw+kyR D8YXZThsS1T537oOQsJ0aBJi45MpeOQ/4ttaiYQ5WTbTyEFX5JLle3V9JY2BNfqypWGK kP4VIjmAxTSzarK8So34z/KiC2LI/K841XVF0WjkWI/PCAafH87ZRupr8l2p9qc+cPu8 JcGzZ13oa7N++f1YWVSX7H7Aid4Rv+9P31ExrypWts70zHprWGSAfWYgAQfu/oEqw22G +f1LHpvQ3qKxsHIGRrsMde4ldSLCSvJ5LbZ7ctHovqax1gwdsD5rZZtrTSa+/+k9GFWv EOIQ== X-Gm-Message-State: AOJu0YxsizdjgjByDK5J9m4dbIhDJhT6NgSKt4vVy/Bf4+DZKv+t3sba DPdMP4R8+/6WRvSqSTI/PnZsQwPbPrxj1x994znNqRKnz5DcYe+o5NBMKPTM X-Google-Smtp-Source: AGHT+IHPXhwYQHLLHzWrbgqvn7i+CEoVgGz/135avwlNCdoBWITJejqhLcxEkgrpU6XuG+3JYtGSXw== X-Received: by 2002:a05:620a:2908:b0:783:8c8d:601e with SMTP id m8-20020a05620a290800b007838c8d601emr2411925qkp.145.1706388086048; Sat, 27 Jan 2024 12:41:26 -0800 (PST) Received: from gnu-cfl-3.localdomain ([172.56.169.51]) by smtp.gmail.com with ESMTPSA id r18-20020a170903411200b001d73adf350asm2819929pld.56.2024.01.27.12.41.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 Jan 2024 12:41:25 -0800 (PST) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 3BB5E740067; Sat, 27 Jan 2024 12:41:24 -0800 (PST) From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Cc: jakub@redhat.com Subject: [PATCH] x86: Generate .cfi_undefined for unsaved callee-saved registers Date: Sat, 27 Jan 2024 12:41:24 -0800 Message-ID: <20240127204124.393779-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-3023.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org When assembler directives for DWARF frame unwind is enabled, generate the .cfi_undefined directive for unsaved callee-saved registers which have been used in the function. gcc/ PR target/38534 * config/i386/i386.cc (ix86_post_cfi_startproc): New. (TARGET_ASM_POST_CFI_STARTPROC): Likewise. gcc/testsuite/ PR target/38534 * gcc.target/i386/no-callee-saved-19.c: New test. * gcc.target/i386/no-callee-saved-20.c: Likewise. * gcc.target/i386/pr38534-7.c: Likewise. * gcc.target/i386/pr38534-8.c: Likewise. --- gcc/config/i386/i386.cc | 37 +++++++++++++++++++ .../gcc.target/i386/no-callee-saved-19.c | 17 +++++++++ .../gcc.target/i386/no-callee-saved-20.c | 12 ++++++ gcc/testsuite/gcc.target/i386/pr38534-7.c | 18 +++++++++ gcc/testsuite/gcc.target/i386/pr38534-8.c | 13 +++++++ 5 files changed, 97 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/no-callee-saved-19.c create mode 100644 gcc/testsuite/gcc.target/i386/no-callee-saved-20.c create mode 100644 gcc/testsuite/gcc.target/i386/pr38534-7.c create mode 100644 gcc/testsuite/gcc.target/i386/pr38534-8.c diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index b3e7c74846e..d4c10a5ef9b 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -22662,6 +22662,40 @@ x86_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta, flag_force_indirect_call = saved_flag_force_indirect_call; } +/* Implement TARGET_ASM_POST_CFI_STARTPROC. Triggered after a + .cfi_startproc directive is emitted into the assembly file. + When assembler directives for DWARF frame unwind is enabled, + output the .cfi_undefined directive for unsaved callee-saved + registers which have been used in the function. */ + +void +ix86_post_cfi_startproc (FILE *f, tree) +{ + if ((cfun->machine->call_saved_registers + == TYPE_NO_CALLEE_SAVED_REGISTERS) + && dwarf2out_do_cfi_asm ()) + for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++) + if (df_regs_ever_live_p (i) + && !fixed_regs[i] + && !call_used_regs[i] + && !STACK_REGNO_P (i) + && !MMX_REGNO_P (i)) + { + if (LEGACY_INT_REGNO_P (i)) + { + if (TARGET_64BIT) + asm_fprintf (f, "\t.cfi_undefined r%s\n", + hi_reg_name[i]); + else + asm_fprintf (f, "\t.cfi_undefined e%s\n", + hi_reg_name[i]); + } + else + asm_fprintf (f, "\t.cfi_undefined %s\n", + hi_reg_name[i]); + } +} + static void x86_file_start (void) { @@ -26281,6 +26315,9 @@ static const scoped_attribute_specs *const ix86_attribute_table[] = #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK #define TARGET_ASM_CAN_OUTPUT_MI_THUNK x86_can_output_mi_thunk +#undef TARGET_ASM_POST_CFI_STARTPROC +#define TARGET_ASM_POST_CFI_STARTPROC ix86_post_cfi_startproc + #undef TARGET_ASM_FILE_START #define TARGET_ASM_FILE_START x86_file_start diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19.c b/gcc/testsuite/gcc.target/i386/no-callee-saved-19.c new file mode 100644 index 00000000000..60a492cffd3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19.c @@ -0,0 +1,17 @@ +/* { dg-do assemble { target *-*-linux* *-*-gnu* } } */ +/* { dg-options "-save-temps -march=tigerlake -O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */ + +#include "no-callee-saved-1.c" + +/* { dg-final { scan-assembler-not "push" } } */ +/* { dg-final { scan-assembler-not "pop" } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined rbx" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined rbp" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r12" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r13" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r14" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r15" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined ebx" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined esi" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined edi" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined ebp" 1 { target ia32 } } } */ diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-20.c b/gcc/testsuite/gcc.target/i386/no-callee-saved-20.c new file mode 100644 index 00000000000..fc94778824a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-20.c @@ -0,0 +1,12 @@ +/* { dg-do compile { target cfi } } */ +/* { dg-options "-march=tigerlake -O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */ + +__attribute__ ((no_callee_saved_registers)) +void +foo (void) +{ +} + +/* { dg-final { scan-assembler-not "push" } } */ +/* { dg-final { scan-assembler-not "pop" } } */ +/* { dg-final { scan-assembler-not ".cfi_undefined" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr38534-7.c b/gcc/testsuite/gcc.target/i386/pr38534-7.c new file mode 100644 index 00000000000..01dbd77cd75 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr38534-7.c @@ -0,0 +1,18 @@ +/* { dg-do assemble { target *-*-linux* *-*-gnu* } } */ +/* { dg-options "-save-temps -march=tigerlake -O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */ + +#include "pr38534-1.c" + +/* { dg-final { scan-assembler-not "push" } } */ +/* { dg-final { scan-assembler-not "pop" } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined rbx" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined rbp" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r12" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r13" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r14" 1 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined r15" 1 { target lp64 } } } */ +/* { dg-final { scan-assembler-not ".cfi_undefined r15" { target x32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined ebx" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined esi" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined edi" 1 { target ia32 } } } */ +/* { dg-final { scan-assembler-times ".cfi_undefined ebp" 1 { target ia32 } } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr38534-8.c b/gcc/testsuite/gcc.target/i386/pr38534-8.c new file mode 100644 index 00000000000..020c1512db1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr38534-8.c @@ -0,0 +1,13 @@ +/* { dg-do compile { target cfi } } */ +/* { dg-options "-march=tigerlake -O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */ + +void +__attribute__((noreturn)) +no_return_to_caller (void) +{ + while (1); +} + +/* { dg-final { scan-assembler-not "push" } } */ +/* { dg-final { scan-assembler-not "pop" } } */ +/* { dg-final { scan-assembler-not ".cfi_undefined" } } */