Skip to content

Commit

Permalink
[AArch64] Support adding X[8-15,18] registers as CSRs.
Browse files Browse the repository at this point in the history
Summary:
Making X[8-15,18] registers call-saved is used to support
CONFIG_ARM64_LSE_ATOMICS in Linux kernel.

Signed-off-by: Tri Vo <[email protected]>

Reviewers: srhines, nickdesaulniers, javed.absar

Reviewed By: nickdesaulniers

Subscribers: kristof.beyls, jfb, cfe-commits

Differential Revision: https://reviews.llvm.org/D52399

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342990 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
vo4 committed Sep 25, 2018
1 parent d6cae43 commit 260dbbf
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 0 deletions.
36 changes: 36 additions & 0 deletions docs/ClangCommandLineReference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2334,6 +2334,42 @@ Reserve the x18 register (AArch64 only)

Reserve the x20 register (AArch64 only)

.. option:: -fcall-saved-x8

Make the x8 register call-saved (AArch64 only)

.. option:: -fcall-saved-x9

Make the x9 register call-saved (AArch64 only)

.. option:: -fcall-saved-x10

Make the x10 register call-saved (AArch64 only)

.. option:: -fcall-saved-x11

Make the x11 register call-saved (AArch64 only)

.. option:: -fcall-saved-x12

Make the x12 register call-saved (AArch64 only)

.. option:: -fcall-saved-x13

Make the x13 register call-saved (AArch64 only)

.. option:: -fcall-saved-x14

Make the x14 register call-saved (AArch64 only)

.. option:: -fcall-saved-x15

Make the x15 register call-saved (AArch64 only)

.. option:: -fcall-saved-x18

Make the x18 register call-saved (AArch64 only)

.. option:: -mfix-cortex-a53-835769, -mno-fix-cortex-a53-835769

Workaround Cortex-A53 erratum 835769 (AArch64 only)
Expand Down
4 changes: 4 additions & 0 deletions include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -2054,6 +2054,10 @@ foreach i = {1-7,18,20} in
def ffixed_x#i : Flag<["-"], "ffixed-x"#i>, Group<m_aarch64_Features_Group>,
HelpText<"Reserve the "#i#" register (AArch64 only)">;

foreach i = {8-15,18} in
def fcall_saved_x#i : Flag<["-"], "fcall-saved-x"#i>, Group<m_aarch64_Features_Group>,
HelpText<"Make the x"#i#" register call-saved (AArch64 only)">;

def msign_return_address : Joined<["-"], "msign-return-address=">,
Flags<[CC1Option]>, Group<m_Group>,
HelpText<"Select return address signing scope">, Values<"none,all,non-leaf">;
Expand Down
27 changes: 27 additions & 0 deletions lib/Driver/ToolChains/Arch/AArch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,33 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
if (Args.hasArg(options::OPT_ffixed_x20))
Features.push_back("+reserve-x20");

if (Args.hasArg(options::OPT_fcall_saved_x8))
Features.push_back("+call-saved-x8");

if (Args.hasArg(options::OPT_fcall_saved_x9))
Features.push_back("+call-saved-x9");

if (Args.hasArg(options::OPT_fcall_saved_x10))
Features.push_back("+call-saved-x10");

if (Args.hasArg(options::OPT_fcall_saved_x11))
Features.push_back("+call-saved-x11");

if (Args.hasArg(options::OPT_fcall_saved_x12))
Features.push_back("+call-saved-x12");

if (Args.hasArg(options::OPT_fcall_saved_x13))
Features.push_back("+call-saved-x13");

if (Args.hasArg(options::OPT_fcall_saved_x14))
Features.push_back("+call-saved-x14");

if (Args.hasArg(options::OPT_fcall_saved_x15))
Features.push_back("+call-saved-x15");

if (Args.hasArg(options::OPT_fcall_saved_x18))
Features.push_back("+call-saved-x18");

if (Args.hasArg(options::OPT_mno_neg_immediates))
Features.push_back("+no-neg-immediates");
}
58 changes: 58 additions & 0 deletions test/Driver/aarch64-call-saved-x-register.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// RUN: %clang -target aarch64-none-gnu -fcall-saved-x8 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X8 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x9 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X9 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x10 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X10 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x11 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X11 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x12 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X12 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x13 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X13 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x14 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X14 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x15 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X15 %s

// RUN: %clang -target aarch64-none-gnu -fcall-saved-x18 -### %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-CALL-SAVED-X18 %s

// Test all call-saved-x# options together.
// RUN: %clang -target aarch64-none-gnu \
// RUN: -fcall-saved-x8 \
// RUN: -fcall-saved-x9 \
// RUN: -fcall-saved-x10 \
// RUN: -fcall-saved-x11 \
// RUN: -fcall-saved-x12 \
// RUN: -fcall-saved-x13 \
// RUN: -fcall-saved-x14 \
// RUN: -fcall-saved-x15 \
// RUN: -fcall-saved-x18 \
// RUN: -### %s 2>&1 | FileCheck %s \
// RUN: --check-prefix=CHECK-CALL-SAVED-X8 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X9 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X10 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X11 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X12 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X13 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X14 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X15 \
// RUN: --check-prefix=CHECK-CALL-SAVED-X18

// CHECK-CALL-SAVED-X8: "-target-feature" "+call-saved-x8"
// CHECK-CALL-SAVED-X9: "-target-feature" "+call-saved-x9"
// CHECK-CALL-SAVED-X10: "-target-feature" "+call-saved-x10"
// CHECK-CALL-SAVED-X11: "-target-feature" "+call-saved-x11"
// CHECK-CALL-SAVED-X12: "-target-feature" "+call-saved-x12"
// CHECK-CALL-SAVED-X13: "-target-feature" "+call-saved-x13"
// CHECK-CALL-SAVED-X14: "-target-feature" "+call-saved-x14"
// CHECK-CALL-SAVED-X15: "-target-feature" "+call-saved-x15"
// CHECK-CALL-SAVED-X18: "-target-feature" "+call-saved-x18"
8 changes: 8 additions & 0 deletions test/Driver/aarch64-fixed-call-saved-x-register.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Check that -ffixed and -fcall-saved flags work correctly together.
// RUN: %clang -target aarch64-none-gnu \
// RUN: -ffixed-x18 \
// RUN: -fcall-saved-x18 \
// RUN: -### %s 2>&1 | FileCheck %s

// CHECK: "-target-feature" "+reserve-x18"
// CHECK: "-target-feature" "+call-saved-x18"

0 comments on commit 260dbbf

Please sign in to comment.