Index: docs/ClangCommandLineReference.rst =================================================================== --- docs/ClangCommandLineReference.rst +++ docs/ClangCommandLineReference.rst @@ -2073,7 +2073,7 @@ ------- .. option:: -ffixed-x18 -Reserve the x18 register (AArch64 only) +Reserve the x18 register (AArch64 only). It is on by default for AArch64 Windows target. .. option:: -mfix-cortex-a53-835769, -mno-fix-cortex-a53-835769 Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -6694,6 +6694,16 @@ BuiltinVaListKind getBuiltinVaListKind() const override { return TargetInfo::CharPtrBuiltinVaList; } + + bool handleTargetFeatures(std::vector &Features, + DiagnosticsEngine &Diags) override { + // Register x18 is reserved for AArch64. We make this the default for + // AArch64 Windows target. + WindowsTargetInfo::handleTargetFeatures(Features, + Diags); + Features.push_back("+reserve-x18"); + return true; + } }; class AArch64beTargetInfo : public AArch64TargetInfo { Index: test/Driver/coff-aarch64-fixed-x18.c =================================================================== --- /dev/null +++ test/Driver/coff-aarch64-fixed-x18.c @@ -0,0 +1,5 @@ +// RUN: %clang -target aarch64-windows -emit-llvm -S %s -o - | FileCheck %s + +// CHECK: "target-features"{{.*}}+reserve-x18 + +void foo() {}