[clang] [Clang][RISCV] Add preprocessor macros for Zicfilp CFI scheme (PR #109600)
Ming-Yi Lai via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 25 02:24:22 PDT 2024
https://github.com/mylai-mtk updated https://github.com/llvm/llvm-project/pull/109600
>From 2eda754ee96aa416063ff65bddfc5e856b626454 Mon Sep 17 00:00:00 2001
From: Ming-Yi Lai <ming-yi.lai at mediatek.com>
Date: Wed, 4 Sep 2024 18:40:48 +0800
Subject: [PATCH 1/4] [clang][RISCV] Introduce command line options for
Zicfilp-backed forward-edge CFI
This patch enables the following command line flags for RISC-V targets:
+ `-fcf-protection=branch` turns on forward-edge control-flow integrity conditioning on RISC-V targets with Zicfilp extension
+ `-mcf-branch-label-scheme=unlabeled|func-sig` selects the label scheme used in the forward-edge CFI conditioning
---
.../clang/Basic/CFProtectionOptions.def | 15 +++++
.../include/clang/Basic/CFProtectionOptions.h | 38 ++++++++++++
clang/include/clang/Basic/CodeGenOptions.def | 2 +
clang/include/clang/Basic/CodeGenOptions.h | 1 +
clang/include/clang/Basic/LangOptions.def | 2 +
clang/include/clang/Basic/LangOptions.h | 2 +
clang/include/clang/Basic/TargetInfo.h | 7 +++
clang/include/clang/Driver/Options.td | 4 ++
clang/lib/Basic/TargetInfo.cpp | 10 ++++
clang/lib/Basic/Targets/RISCV.h | 22 +++++++
clang/lib/Driver/ToolChains/Clang.cpp | 4 ++
clang/lib/Frontend/CompilerInvocation.cpp | 40 +++++++++++++
.../test/CodeGen/RISCV/riscv-cf-protection.c | 58 +++++++++++++++++++
13 files changed, 205 insertions(+)
create mode 100644 clang/include/clang/Basic/CFProtectionOptions.def
create mode 100644 clang/include/clang/Basic/CFProtectionOptions.h
create mode 100644 clang/test/CodeGen/RISCV/riscv-cf-protection.c
diff --git a/clang/include/clang/Basic/CFProtectionOptions.def b/clang/include/clang/Basic/CFProtectionOptions.def
new file mode 100644
index 00000000000000..b9df2de7f7eba0
--- /dev/null
+++ b/clang/include/clang/Basic/CFProtectionOptions.def
@@ -0,0 +1,15 @@
+//===-- CFProtectionOptions.def - cf-protection options ---------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifdef CF_BRANCH_LABEL_SCHEME
+CF_BRANCH_LABEL_SCHEME(Unlabeled, unlabeled)
+CF_BRANCH_LABEL_SCHEME(FuncSig, func-sig)
+
+#undef CF_BRANCH_LABEL_SCHEME
+#endif // #ifdef CF_BRANCH_LABEL_SCHEME
diff --git a/clang/include/clang/Basic/CFProtectionOptions.h b/clang/include/clang/Basic/CFProtectionOptions.h
new file mode 100644
index 00000000000000..13f46d4c13e7e7
--- /dev/null
+++ b/clang/include/clang/Basic/CFProtectionOptions.h
@@ -0,0 +1,38 @@
+//===--- CFProtectionOptions.h ----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines constants for -fcf-protection and other related flags.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_BASIC_CFPROTECTIONOPTIONS_H
+#define LLVM_CLANG_BASIC_CFPROTECTIONOPTIONS_H
+
+#include "llvm/Support/ErrorHandling.h"
+
+namespace clang {
+
+enum class CFBranchLabelSchemeKind {
+ Default,
+#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) Kind,
+#include "clang/Basic/CFProtectionOptions.def"
+};
+
+static inline const char *
+getCFBranchLabelSchemeFlagVal(const CFBranchLabelSchemeKind Scheme) {
+#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
+ if (Scheme == CFBranchLabelSchemeKind::Kind) \
+ return #FlagVal;
+#include "clang/Basic/CFProtectionOptions.def"
+
+ llvm::report_fatal_error("invalid scheme");
+}
+
+} // namespace clang
+
+#endif // #ifndef LLVM_CLANG_BASIC_CFPROTECTIONOPTIONS_H
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index b600198998d85b..de7ae73f8a603b 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -110,6 +110,8 @@ CODEGENOPT(CFProtectionReturn , 1, 0) ///< if -fcf-protection is
///< set to full or return.
CODEGENOPT(CFProtectionBranch , 1, 0) ///< if -fcf-protection is
///< set to full or branch.
+ENUM_CODEGENOPT(CFBranchLabelScheme, CFBranchLabelSchemeKind, 2,
+ CFBranchLabelSchemeKind::Default) ///< if -mcf-branch-label-scheme is set.
CODEGENOPT(FunctionReturnThunks, 1, 0) ///< -mfunction-return={keep|thunk-extern}
CODEGENOPT(IndirectBranchCSPrefix, 1, 0) ///< if -mindirect-branch-cs-prefix
///< is set.
diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h
index f2a707a8ba8d76..a6953c17a447ef 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -13,6 +13,7 @@
#ifndef LLVM_CLANG_BASIC_CODEGENOPTIONS_H
#define LLVM_CLANG_BASIC_CODEGENOPTIONS_H
+#include "clang/Basic/CFProtectionOptions.h"
#include "clang/Basic/PointerAuthOptions.h"
#include "clang/Basic/Sanitizers.h"
#include "clang/Basic/XRayInstr.h"
diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def
index fd3346d29f26a3..68db400c22e6c1 100644
--- a/clang/include/clang/Basic/LangOptions.def
+++ b/clang/include/clang/Basic/LangOptions.def
@@ -364,6 +364,8 @@ BENIGN_LANGOPT(CompatibilityQualifiedIdBlockParamTypeChecking, 1, 0,
LANGOPT(ObjCDisableDirectMethodsForTesting, 1, 0,
"Disable recognition of objc_direct methods")
LANGOPT(CFProtectionBranch , 1, 0, "Control-Flow Branch Protection enabled")
+ENUM_LANGOPT(CFBranchLabelScheme, CFBranchLabelSchemeKind, 2, CFBranchLabelSchemeKind::Default,
+ "Control-Flow Branch Protection Label Scheme")
LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")
ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode")
LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for OpenCL")
diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index 6c186c410e158d..c3d53ca92d450c 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -14,6 +14,7 @@
#ifndef LLVM_CLANG_BASIC_LANGOPTIONS_H
#define LLVM_CLANG_BASIC_LANGOPTIONS_H
+#include "clang/Basic/CFProtectionOptions.h"
#include "clang/Basic/CommentOptions.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangStandard.h"
@@ -73,6 +74,7 @@ class LangOptionsBase {
public:
using Visibility = clang::Visibility;
using RoundingMode = llvm::RoundingMode;
+ using CFBranchLabelSchemeKind = clang::CFBranchLabelSchemeKind;
enum GCMode { NonGC, GCOnly, HybridGC };
enum StackProtectorMode { SSPOff, SSPOn, SSPStrong, SSPReq };
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index f31d88a354ea28..4388500ce1bb51 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -16,6 +16,7 @@
#include "clang/Basic/AddressSpaces.h"
#include "clang/Basic/BitmaskEnum.h"
+#include "clang/Basic/CFProtectionOptions.h"
#include "clang/Basic/CodeGenOptions.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangOptions.h"
@@ -1727,6 +1728,12 @@ class TargetInfo : public TransferrableTargetInfo,
virtual bool
checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const;
+ /// Get the target default CFBranchLabelScheme scheme
+ virtual CFBranchLabelSchemeKind getDefaultCFBranchLabelScheme() const;
+
+ virtual bool
+ checkCFBranchLabelSchemeSupported(const CFBranchLabelSchemeKind Scheme) const;
+
/// Check if the target supports CFProtection return.
virtual bool
checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const;
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 002f60350543d9..ccbe302e4937e1 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2841,6 +2841,10 @@ def fcf_protection : Flag<["-"], "fcf-protection">, Group<f_Group>,
Visibility<[ClangOption, CLOption, CC1Option]>,
Alias<fcf_protection_EQ>, AliasArgs<["full"]>,
HelpText<"Enable cf-protection in 'full' mode">;
+def mcf_branch_label_scheme_EQ : Joined<["-"], "mcf-branch-label-scheme=">,
+ Visibility<[ClangOption, CC1Option]>, Group<m_Group>,
+ HelpText<"Select label scheme for branch control-flow architecture protection">,
+ Values<"unlabeled,func-sig">;
def mfunction_return_EQ : Joined<["-"], "mfunction-return=">,
Group<m_Group>, Visibility<[ClangOption, CLOption, CC1Option]>,
HelpText<"Replace returns with jumps to ``__x86_return_thunk`` (x86 only, error otherwise)">,
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 29f5cd14e46e11..589acdb0796530 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -198,6 +198,16 @@ TargetInfo::checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const {
return false;
}
+CFBranchLabelSchemeKind TargetInfo::getDefaultCFBranchLabelScheme() const {
+ // if this hook is called, the target should override it
+ llvm::report_fatal_error("not implemented");
+}
+
+bool TargetInfo::checkCFBranchLabelSchemeSupported(
+ const CFBranchLabelSchemeKind) const {
+ return false;
+}
+
bool
TargetInfo::checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const {
Diags.Report(diag::err_opt_not_valid_on_target) << "cf-protection=return";
diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h
index 351ef21e197c4d..413eb42b2e1e2c 100644
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -134,6 +134,28 @@ class RISCVTargetInfo : public TargetInfo {
bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize,
bool &HasSizeMismatch) const override;
+
+ bool
+ checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const override {
+ if (ISAInfo->hasExtension("zicfilp"))
+ return true;
+ return TargetInfo::checkCFProtectionBranchSupported(Diags);
+ }
+
+ CFBranchLabelSchemeKind getDefaultCFBranchLabelScheme() const override {
+ return CFBranchLabelSchemeKind::FuncSig;
+ }
+
+ bool checkCFBranchLabelSchemeSupported(
+ const CFBranchLabelSchemeKind Scheme) const override {
+ switch (Scheme) {
+ case CFBranchLabelSchemeKind::Default:
+ case CFBranchLabelSchemeKind::Unlabeled:
+ case CFBranchLabelSchemeKind::FuncSig:
+ return true;
+ }
+ return false;
+ }
};
class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo {
public:
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 0bab48caf1a5e2..d3c5c3d9872ee4 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -7012,6 +7012,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (Arg *A = Args.getLastArg(options::OPT_fcf_protection_EQ)) {
CmdArgs.push_back(
Args.MakeArgString(Twine("-fcf-protection=") + A->getValue()));
+
+ if (Arg *SA = Args.getLastArg(options::OPT_mcf_branch_label_scheme_EQ))
+ CmdArgs.push_back(Args.MakeArgString(Twine("-mcf-branch-label-scheme=") +
+ SA->getValue()));
}
if (Arg *A = Args.getLastArg(options::OPT_mfunction_return_EQ))
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index efd852593468aa..6c09843a7146f4 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1688,6 +1688,18 @@ void CompilerInvocationBase::GenerateCodeGenArgs(const CodeGenOptions &Opts,
else if (Opts.CFProtectionBranch)
GenerateArg(Consumer, OPT_fcf_protection_EQ, "branch");
+ if (Opts.CFProtectionBranch) {
+ switch (Opts.getCFBranchLabelScheme()) {
+ case CFBranchLabelSchemeKind::Default:
+ break;
+#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
+ case CFBranchLabelSchemeKind::Kind: \
+ GenerateArg(Consumer, OPT_mcf_branch_label_scheme_EQ, #FlagVal); \
+ break;
+#include "clang/Basic/CFProtectionOptions.def"
+ }
+ }
+
if (Opts.FunctionReturnThunks)
GenerateArg(Consumer, OPT_mfunction_return_EQ, "thunk-extern");
@@ -2022,6 +2034,22 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
}
+ if (Opts.CFProtectionBranch && T.isRISCV()) {
+ if (const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
+ const auto Scheme =
+ llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
+#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
+ .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
+#include "clang/Basic/CFProtectionOptions.def"
+ .Default(CFBranchLabelSchemeKind::Default);
+ if (Scheme != CFBranchLabelSchemeKind::Default)
+ Opts.setCFBranchLabelScheme(Scheme);
+ else
+ Diags.Report(diag::err_drv_invalid_value)
+ << A->getAsString(Args) << A->getValue();
+ }
+ }
+
if (const Arg *A = Args.getLastArg(OPT_mfunction_return_EQ)) {
auto Val = llvm::StringSwitch<llvm::FunctionReturnThunksKind>(A->getValue())
.Case("keep", llvm::FunctionReturnThunksKind::Keep)
@@ -3952,6 +3980,18 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
}
}
+ if (Opts.CFProtectionBranch) {
+ if (const Arg *A = Args.getLastArg(OPT_mcf_branch_label_scheme_EQ)) {
+ const auto Scheme =
+ llvm::StringSwitch<CFBranchLabelSchemeKind>(A->getValue())
+#define CF_BRANCH_LABEL_SCHEME(Kind, FlagVal) \
+ .Case(#FlagVal, CFBranchLabelSchemeKind::Kind)
+#include "clang/Basic/CFProtectionOptions.def"
+ .Default(CFBranchLabelSchemeKind::Default);
+ Opts.setCFBranchLabelScheme(Scheme);
+ }
+ }
+
if ((Args.hasArg(OPT_fsycl_is_device) || Args.hasArg(OPT_fsycl_is_host)) &&
!Args.hasArg(OPT_sycl_std_EQ)) {
// If the user supplied -fsycl-is-device or -fsycl-is-host, but failed to
diff --git a/clang/test/CodeGen/RISCV/riscv-cf-protection.c b/clang/test/CodeGen/RISCV/riscv-cf-protection.c
new file mode 100644
index 00000000000000..02a22006b1638f
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/riscv-cf-protection.c
@@ -0,0 +1,58 @@
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+
+// RUN: not %clang --target=riscv32 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+
+// RUN: not %clang --target=riscv32 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+
+// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+
+// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+
+// RUN: not %clang --target=riscv64 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+
+// RUN: not %clang --target=riscv64 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+
+// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+
+// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -c %s \
+// RUN: -o /dev/null 2>&1 \
+// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+
+// CHECK-BRANCH-PROT-INVALID: error: option 'cf-protection=branch' cannot be
+// CHECK-BRANCH-PROT-INVALID-SAME: specified on this target
+// CHECK-UNLABELED-SCHEME-UNUSED: warning: argument unused during compilation:
+// CHECK-UNLABELED-SCHEME-UNUSED-SAME: '-mcf-branch-label-scheme=unlabeled'
+// CHECK-FUNC-SIG-SCHEME-UNUSED: warning: argument unused during compilation:
+// CHECK-FUNC-SIG-SCHEME-UNUSED-SAME: '-mcf-branch-label-scheme=func-sig'
>From f13e462407b4e2e41ca9d62ec8fff54099833ad5 Mon Sep 17 00:00:00 2001
From: Ming-Yi Lai <ming-yi.lai at mediatek.com>
Date: Wed, 25 Sep 2024 11:05:40 +0800
Subject: [PATCH 2/4] [clang] Don't force diagnosing when checking if
-fcf-protection=branch is supported
This turns the target hook that checks if `-fcf-protection=branch` is supported
into a pure check function that is suitable to be used in more places.
---
clang/include/clang/Basic/TargetInfo.h | 3 +--
clang/lib/Basic/TargetInfo.cpp | 6 +-----
clang/lib/Basic/Targets/RISCV.h | 7 ++-----
clang/lib/Basic/Targets/X86.h | 7 ++-----
clang/lib/CodeGen/CodeGenModule.cpp | 12 +++++++-----
5 files changed, 13 insertions(+), 22 deletions(-)
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index 4388500ce1bb51..4032d7840528dc 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1725,8 +1725,7 @@ class TargetInfo : public TransferrableTargetInfo,
}
/// Check if the target supports CFProtection branch.
- virtual bool
- checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const;
+ virtual bool checkCFProtectionBranchSupported() const;
/// Get the target default CFBranchLabelScheme scheme
virtual CFBranchLabelSchemeKind getDefaultCFBranchLabelScheme() const;
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 589acdb0796530..4108eba1916578 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -192,11 +192,7 @@ void TargetInfo::resetDataLayout(StringRef DL, const char *ULP) {
UserLabelPrefix = ULP;
}
-bool
-TargetInfo::checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const {
- Diags.Report(diag::err_opt_not_valid_on_target) << "cf-protection=branch";
- return false;
-}
+bool TargetInfo::checkCFProtectionBranchSupported() const { return false; }
CFBranchLabelSchemeKind TargetInfo::getDefaultCFBranchLabelScheme() const {
// if this hook is called, the target should override it
diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h
index 413eb42b2e1e2c..8a2ee2cbee52b3 100644
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -135,11 +135,8 @@ class RISCVTargetInfo : public TargetInfo {
bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize,
bool &HasSizeMismatch) const override;
- bool
- checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const override {
- if (ISAInfo->hasExtension("zicfilp"))
- return true;
- return TargetInfo::checkCFProtectionBranchSupported(Diags);
+ bool checkCFProtectionBranchSupported() const override {
+ return ISAInfo->hasExtension("zicfilp");
}
CFBranchLabelSchemeKind getDefaultCFBranchLabelScheme() const override {
diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h
index a99ae62984c7d5..58344a2ad3227a 100644
--- a/clang/lib/Basic/Targets/X86.h
+++ b/clang/lib/Basic/Targets/X86.h
@@ -266,11 +266,8 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {
return TargetInfo::checkCFProtectionReturnSupported(Diags);
};
- bool
- checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const override {
- if (CPU == llvm::X86::CK_None || CPU >= llvm::X86::CK_PentiumPro)
- return true;
- return TargetInfo::checkCFProtectionBranchSupported(Diags);
+ bool checkCFProtectionBranchSupported() const override {
+ return CPU == llvm::X86::CK_None || CPU >= llvm::X86::CK_PentiumPro;
};
virtual bool validateOperandSize(const llvm::StringMap<bool> &FeatureMap,
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index d53d47979f29fb..cbedd9ab930821 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1159,11 +1159,13 @@ void CodeGenModule::Release() {
1);
}
- if (CodeGenOpts.CFProtectionBranch &&
- Target.checkCFProtectionBranchSupported(getDiags())) {
- // Indicate that we want to instrument branch control flow protection.
- getModule().addModuleFlag(llvm::Module::Min, "cf-protection-branch",
- 1);
+ if (CodeGenOpts.CFProtectionBranch) {
+ if (Target.checkCFProtectionBranchSupported())
+ // Indicate that we want to instrument branch control flow protection.
+ getModule().addModuleFlag(llvm::Module::Min, "cf-protection-branch", 1);
+ else
+ getDiags().Report(diag::err_opt_not_valid_on_target)
+ << "cf-protection=branch";
}
if (CodeGenOpts.FunctionReturnThunks)
>From 60a6830059012f736cbec7d86f605e83c27d3d21 Mon Sep 17 00:00:00 2001
From: Ming-Yi Lai <ming-yi.lai at mediatek.com>
Date: Wed, 25 Sep 2024 11:55:40 +0800
Subject: [PATCH 3/4] [clang] Support diagnosing in
TargetInfo::getTargetDefines()
This allows reporting target-specific diagnostics when checking conditions for
predefined macros
---
clang/include/clang/Basic/TargetInfo.h | 5 +--
clang/lib/Basic/Targets/AArch64.cpp | 27 +++++++-----
clang/lib/Basic/Targets/AArch64.h | 21 +++++-----
clang/lib/Basic/Targets/AMDGPU.cpp | 3 +-
clang/lib/Basic/Targets/AMDGPU.h | 4 +-
clang/lib/Basic/Targets/ARC.cpp | 3 +-
clang/lib/Basic/Targets/ARC.h | 4 +-
clang/lib/Basic/Targets/ARM.cpp | 42 +++++++++++--------
clang/lib/Basic/Targets/ARM.h | 32 +++++++-------
clang/lib/Basic/Targets/AVR.cpp | 3 +-
clang/lib/Basic/Targets/AVR.h | 4 +-
clang/lib/Basic/Targets/BPF.cpp | 3 +-
clang/lib/Basic/Targets/BPF.h | 4 +-
clang/lib/Basic/Targets/CSKY.cpp | 3 +-
clang/lib/Basic/Targets/CSKY.h | 4 +-
clang/lib/Basic/Targets/DirectX.cpp | 3 +-
clang/lib/Basic/Targets/DirectX.h | 4 +-
clang/lib/Basic/Targets/Hexagon.cpp | 3 +-
clang/lib/Basic/Targets/Hexagon.h | 4 +-
clang/lib/Basic/Targets/Lanai.cpp | 3 +-
clang/lib/Basic/Targets/Lanai.h | 4 +-
clang/lib/Basic/Targets/LoongArch.cpp | 3 +-
clang/lib/Basic/Targets/LoongArch.h | 4 +-
clang/lib/Basic/Targets/M68k.cpp | 3 +-
clang/lib/Basic/Targets/M68k.h | 4 +-
clang/lib/Basic/Targets/MSP430.cpp | 3 +-
clang/lib/Basic/Targets/MSP430.h | 4 +-
clang/lib/Basic/Targets/Mips.cpp | 3 +-
clang/lib/Basic/Targets/Mips.h | 4 +-
clang/lib/Basic/Targets/NVPTX.cpp | 3 +-
clang/lib/Basic/Targets/NVPTX.h | 4 +-
clang/lib/Basic/Targets/OSTargets.h | 6 +--
clang/lib/Basic/Targets/PNaCl.h | 4 +-
clang/lib/Basic/Targets/PPC.cpp | 3 +-
clang/lib/Basic/Targets/PPC.h | 4 +-
clang/lib/Basic/Targets/RISCV.cpp | 3 +-
clang/lib/Basic/Targets/RISCV.h | 4 +-
clang/lib/Basic/Targets/SPIR.cpp | 36 +++++++++-------
clang/lib/Basic/Targets/SPIR.h | 32 +++++++-------
clang/lib/Basic/Targets/Sparc.cpp | 13 +++---
clang/lib/Basic/Targets/Sparc.h | 12 +++---
clang/lib/Basic/Targets/SystemZ.cpp | 3 +-
clang/lib/Basic/Targets/SystemZ.h | 4 +-
clang/lib/Basic/Targets/TCE.cpp | 6 ++-
clang/lib/Basic/Targets/TCE.h | 8 ++--
clang/lib/Basic/Targets/VE.cpp | 3 +-
clang/lib/Basic/Targets/VE.h | 4 +-
clang/lib/Basic/Targets/WebAssembly.cpp | 13 +++---
clang/lib/Basic/Targets/WebAssembly.h | 12 +++---
clang/lib/Basic/Targets/X86.cpp | 3 +-
clang/lib/Basic/Targets/X86.h | 56 ++++++++++++-------------
clang/lib/Basic/Targets/XCore.cpp | 3 +-
clang/lib/Basic/Targets/XCore.h | 4 +-
clang/lib/Frontend/InitPreprocessor.cpp | 11 +++--
54 files changed, 258 insertions(+), 207 deletions(-)
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index 4032d7840528dc..197ce442fff833 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1004,9 +1004,8 @@ class TargetInfo : public TransferrableTargetInfo,
/// Appends the target-specific \#define values for this
/// target set to the specified buffer.
- virtual void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const = 0;
-
+ virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const = 0;
/// Return information about target-specific builtins for
/// the current primary target, and info about which builtins are non-portable
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index 5f5dfcb722f9d4..41171758596c69 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -374,7 +374,8 @@ void AArch64TargetInfo::getTargetDefinesARMV95A(const LangOptions &Opts,
}
void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
// Target identification.
if (getTriple().isWindowsArm64EC()) {
// Define the same set of macros as would be defined on x86_64 to ensure that
@@ -1530,9 +1531,10 @@ void AArch64leTargetInfo::setDataLayout() {
}
void AArch64leTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__AARCH64EL__");
- AArch64TargetInfo::getTargetDefines(Opts, Builder);
+ AArch64TargetInfo::getTargetDefines(Opts, Builder, Diags);
}
AArch64beTargetInfo::AArch64beTargetInfo(const llvm::Triple &Triple,
@@ -1540,11 +1542,12 @@ AArch64beTargetInfo::AArch64beTargetInfo(const llvm::Triple &Triple,
: AArch64TargetInfo(Triple, Opts) {}
void AArch64beTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__AARCH64EB__");
Builder.defineMacro("__AARCH_BIG_ENDIAN");
Builder.defineMacro("__ARM_BIG_ENDIAN");
- AArch64TargetInfo::getTargetDefines(Opts, Builder);
+ AArch64TargetInfo::getTargetDefines(Opts, Builder, Diags);
}
void AArch64beTargetInfo::setDataLayout() {
@@ -1613,9 +1616,10 @@ MicrosoftARM64TargetInfo::MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
TheCXXABI.set(TargetCXXABI::Microsoft);
}
-void MicrosoftARM64TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- WindowsARM64TargetInfo::getTargetDefines(Opts, Builder);
+void MicrosoftARM64TargetInfo::getTargetDefines(
+ const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ WindowsARM64TargetInfo::getTargetDefines(Opts, Builder, Diags);
if (getTriple().isWindowsArm64EC()) {
Builder.defineMacro("_M_X64", "100");
Builder.defineMacro("_M_AMD64", "100");
@@ -1713,8 +1717,9 @@ RenderScript64TargetInfo::RenderScript64TargetInfo(const llvm::Triple &Triple,
IsRenderScriptTarget = true;
}
-void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+void RenderScript64TargetInfo::getTargetDefines(
+ const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__RENDERSCRIPT__");
- AArch64leTargetInfo::getTargetDefines(Opts, Builder);
+ AArch64leTargetInfo::getTargetDefines(Opts, Builder, Diags);
}
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
index 526f7f30a38618..636db80a66cd75 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -148,8 +148,8 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
MacroBuilder &Builder) const;
void getTargetDefinesARMV95A(const LangOptions &Opts,
MacroBuilder &Builder) const;
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
@@ -211,8 +211,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {
public:
AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
+
private:
void setDataLayout() override;
};
@@ -239,8 +240,8 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo
MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
TargetInfo::CallingConvKind
getCallingConvKind(bool ClangABICompat4) const override;
@@ -258,8 +259,8 @@ class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo
class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {
public:
AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
private:
void setDataLayout() override;
@@ -284,8 +285,8 @@ class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo
RenderScript64TargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
} // namespace targets
diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp
index 3b748d0249d57b..673262d3e57227 100644
--- a/clang/lib/Basic/Targets/AMDGPU.cpp
+++ b/clang/lib/Basic/Targets/AMDGPU.cpp
@@ -272,7 +272,8 @@ ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
}
void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__AMD__");
Builder.defineMacro("__AMDGPU__");
diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h
index 94d9ba93ed226f..a0fc2eeb7685c8 100644
--- a/clang/lib/Basic/Targets/AMDGPU.h
+++ b/clang/lib/Basic/Targets/AMDGPU.h
@@ -248,8 +248,8 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
bool useFP16ConversionIntrinsics() const override { return false; }
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
BuiltinVaListKind getBuiltinVaListKind() const override {
return TargetInfo::CharPtrBuiltinVaList;
diff --git a/clang/lib/Basic/Targets/ARC.cpp b/clang/lib/Basic/Targets/ARC.cpp
index 5cc13e2cf72866..82005f311c81dd 100644
--- a/clang/lib/Basic/Targets/ARC.cpp
+++ b/clang/lib/Basic/Targets/ARC.cpp
@@ -19,6 +19,7 @@ using namespace clang;
using namespace clang::targets;
void ARCTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__arc__");
}
diff --git a/clang/lib/Basic/Targets/ARC.h b/clang/lib/Basic/Targets/ARC.h
index fcbfdd6eec5862..29767b2166cf82 100644
--- a/clang/lib/Basic/Targets/ARC.h
+++ b/clang/lib/Basic/Targets/ARC.h
@@ -37,8 +37,8 @@ class LLVM_LIBRARY_VISIBILITY ARCTargetInfo : public TargetInfo {
"i32:32:32-f32:32:32-i64:32-f64:32-a:0:32-n32");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override {
return std::nullopt;
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 7423626d7c3cbf..1efb96ae97a8ad 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -712,7 +712,8 @@ void ARMTargetInfo::getTargetDefinesARMV83A(const LangOptions &Opts,
}
void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
// Target identification.
Builder.defineMacro("__arm");
Builder.defineMacro("__arm__");
@@ -1349,9 +1350,10 @@ ARMleTargetInfo::ARMleTargetInfo(const llvm::Triple &Triple,
: ARMTargetInfo(Triple, Opts) {}
void ARMleTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__ARMEL__");
- ARMTargetInfo::getTargetDefines(Opts, Builder);
+ ARMTargetInfo::getTargetDefines(Opts, Builder, Diags);
}
ARMbeTargetInfo::ARMbeTargetInfo(const llvm::Triple &Triple,
@@ -1359,10 +1361,11 @@ ARMbeTargetInfo::ARMbeTargetInfo(const llvm::Triple &Triple,
: ARMTargetInfo(Triple, Opts) {}
void ARMbeTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__ARMEB__");
Builder.defineMacro("__ARM_BIG_ENDIAN");
- ARMTargetInfo::getTargetDefines(Opts, Builder);
+ ARMTargetInfo::getTargetDefines(Opts, Builder, Diags);
}
WindowsARMTargetInfo::WindowsARMTargetInfo(const llvm::Triple &Triple,
@@ -1421,8 +1424,9 @@ ItaniumWindowsARMleTargetInfo::ItaniumWindowsARMleTargetInfo(
}
void ItaniumWindowsARMleTargetInfo::getTargetDefines(
- const LangOptions &Opts, MacroBuilder &Builder) const {
- WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
+ const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ WindowsARMTargetInfo::getTargetDefines(Opts, Builder, Diags);
if (Opts.MSVCCompat)
WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
@@ -1435,9 +1439,10 @@ MicrosoftARMleTargetInfo::MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
TheCXXABI.set(TargetCXXABI::Microsoft);
}
-void MicrosoftARMleTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
+void MicrosoftARMleTargetInfo::getTargetDefines(
+ const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ WindowsARMTargetInfo::getTargetDefines(Opts, Builder, Diags);
WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
}
@@ -1448,8 +1453,9 @@ MinGWARMTargetInfo::MinGWARMTargetInfo(const llvm::Triple &Triple,
}
void MinGWARMTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ WindowsARMTargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("_ARM_");
}
@@ -1463,8 +1469,9 @@ CygwinARMTargetInfo::CygwinARMTargetInfo(const llvm::Triple &Triple,
}
void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- ARMleTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ ARMleTargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("_ARM_");
Builder.defineMacro("__CYGWIN__");
Builder.defineMacro("__CYGWIN32__");
@@ -1503,8 +1510,9 @@ RenderScript32TargetInfo::RenderScript32TargetInfo(const llvm::Triple &Triple,
LongWidth = LongAlign = 64;
}
-void RenderScript32TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+void RenderScript32TargetInfo::getTargetDefines(
+ const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__RENDERSCRIPT__");
- ARMleTargetInfo::getTargetDefines(Opts, Builder);
+ ARMleTargetInfo::getTargetDefines(Opts, Builder, Diags);
}
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index df9855a52e61c0..bd9b1a85a23756 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -193,8 +193,8 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
MacroBuilder &Builder) const;
void getTargetDefinesARMV83A(const LangOptions &Opts,
MacroBuilder &Builder) const;
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
@@ -234,15 +234,15 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
class LLVM_LIBRARY_VISIBILITY ARMleTargetInfo : public ARMTargetInfo {
public:
ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY ARMbeTargetInfo : public ARMTargetInfo {
public:
ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY WindowsARMTargetInfo
@@ -267,8 +267,8 @@ class LLVM_LIBRARY_VISIBILITY ItaniumWindowsARMleTargetInfo
ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
// Windows ARM, MS (C++) ABI
@@ -278,8 +278,8 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftARMleTargetInfo
MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
// ARM MinGW target
@@ -287,8 +287,8 @@ class LLVM_LIBRARY_VISIBILITY MinGWARMTargetInfo : public WindowsARMTargetInfo {
public:
MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
// ARM Cygwin target
@@ -296,8 +296,8 @@ class LLVM_LIBRARY_VISIBILITY CygwinARMTargetInfo : public ARMleTargetInfo {
public:
CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY DarwinARMTargetInfo
@@ -317,8 +317,8 @@ class LLVM_LIBRARY_VISIBILITY RenderScript32TargetInfo
RenderScript32TargetInfo(const llvm::Triple &Triple,
const TargetOptions &Opts);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
} // namespace targets
diff --git a/clang/lib/Basic/Targets/AVR.cpp b/clang/lib/Basic/Targets/AVR.cpp
index 85ca4bc30c4612..5e09c1d92c8fe4 100644
--- a/clang/lib/Basic/Targets/AVR.cpp
+++ b/clang/lib/Basic/Targets/AVR.cpp
@@ -446,7 +446,8 @@ AVRTargetInfo::handleAsmEscapedChar(char EscChar) const {
}
void AVRTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("AVR");
Builder.defineMacro("__AVR");
Builder.defineMacro("__AVR__");
diff --git a/clang/lib/Basic/Targets/AVR.h b/clang/lib/Basic/Targets/AVR.h
index feeb04f37eeba7..b6e35213f27b76 100644
--- a/clang/lib/Basic/Targets/AVR.h
+++ b/clang/lib/Basic/Targets/AVR.h
@@ -58,8 +58,8 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override {
return std::nullopt;
diff --git a/clang/lib/Basic/Targets/BPF.cpp b/clang/lib/Basic/Targets/BPF.cpp
index 931f407ecb0d7e..61ff7a5e7f87a4 100644
--- a/clang/lib/Basic/Targets/BPF.cpp
+++ b/clang/lib/Basic/Targets/BPF.cpp
@@ -26,7 +26,8 @@ static constexpr Builtin::Info BuiltinInfo[] = {
};
void BPFTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__bpf__");
Builder.defineMacro("__BPF__");
diff --git a/clang/lib/Basic/Targets/BPF.h b/clang/lib/Basic/Targets/BPF.h
index d19b37dd4df7a7..5f1147ff02eb7a 100644
--- a/clang/lib/Basic/Targets/BPF.h
+++ b/clang/lib/Basic/Targets/BPF.h
@@ -44,8 +44,8 @@ class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {
TLSSupported = false;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasFeature(StringRef Feature) const override {
return Feature == "bpf" || Feature == "alu32" || Feature == "dwarfris";
diff --git a/clang/lib/Basic/Targets/CSKY.cpp b/clang/lib/Basic/Targets/CSKY.cpp
index c8bf8b9234d243..0dbd0171bfdf87 100644
--- a/clang/lib/Basic/Targets/CSKY.cpp
+++ b/clang/lib/Basic/Targets/CSKY.cpp
@@ -32,7 +32,8 @@ bool CSKYTargetInfo::setCPU(const std::string &Name) {
}
void CSKYTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__csky__", "2");
Builder.defineMacro("__CSKY__", "2");
Builder.defineMacro("__ckcore__", "2");
diff --git a/clang/lib/Basic/Targets/CSKY.h b/clang/lib/Basic/Targets/CSKY.h
index 94d4eeb9a1fff4..c31c8bd6664e48 100644
--- a/clang/lib/Basic/Targets/CSKY.h
+++ b/clang/lib/Basic/Targets/CSKY.h
@@ -84,8 +84,8 @@ class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo {
std::string_view getClobbers() const override { return ""; }
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasFeature(StringRef Feature) const override;
bool handleTargetFeatures(std::vector<std::string> &Features,
DiagnosticsEngine &Diags) override;
diff --git a/clang/lib/Basic/Targets/DirectX.cpp b/clang/lib/Basic/Targets/DirectX.cpp
index 0dd27e6e93b33b..5d216b17ccf934 100644
--- a/clang/lib/Basic/Targets/DirectX.cpp
+++ b/clang/lib/Basic/Targets/DirectX.cpp
@@ -17,6 +17,7 @@ using namespace clang;
using namespace clang::targets;
void DirectXTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
DefineStd(Builder, "DIRECTX", Opts);
}
diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h
index cf7ea5e83503dc..836c6ed6d9c874 100644
--- a/clang/lib/Basic/Targets/DirectX.h
+++ b/clang/lib/Basic/Targets/DirectX.h
@@ -65,8 +65,8 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
TheCXXABI.set(TargetCXXABI::Microsoft);
}
bool useFP16ConversionIntrinsics() const override { return false; }
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasFeature(StringRef Feature) const override {
return Feature == "directx";
diff --git a/clang/lib/Basic/Targets/Hexagon.cpp b/clang/lib/Basic/Targets/Hexagon.cpp
index 0282ac812c306f..7022cf093af23d 100644
--- a/clang/lib/Basic/Targets/Hexagon.cpp
+++ b/clang/lib/Basic/Targets/Hexagon.cpp
@@ -20,7 +20,8 @@ using namespace clang;
using namespace clang::targets;
void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__qdsp6__", "1");
Builder.defineMacro("__hexagon__", "1");
diff --git a/clang/lib/Basic/Targets/Hexagon.h b/clang/lib/Basic/Targets/Hexagon.h
index 7f053ab7e48886..dd4e1f443f9db8 100644
--- a/clang/lib/Basic/Targets/Hexagon.h
+++ b/clang/lib/Basic/Targets/Hexagon.h
@@ -88,8 +88,8 @@ class LLVM_LIBRARY_VISIBILITY HexagonTargetInfo : public TargetInfo {
return false;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool isCLZForZeroUndef() const override { return false; }
diff --git a/clang/lib/Basic/Targets/Lanai.cpp b/clang/lib/Basic/Targets/Lanai.cpp
index 8722a369ed87ff..80904d6677ca9e 100644
--- a/clang/lib/Basic/Targets/Lanai.cpp
+++ b/clang/lib/Basic/Targets/Lanai.cpp
@@ -55,7 +55,8 @@ bool LanaiTargetInfo::hasFeature(StringRef Feature) const {
}
void LanaiTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
// Define __lanai__ when building for target lanai.
Builder.defineMacro("__lanai__");
diff --git a/clang/lib/Basic/Targets/Lanai.h b/clang/lib/Basic/Targets/Lanai.h
index 144cbc7de98931..341dd1994738df 100644
--- a/clang/lib/Basic/Targets/Lanai.h
+++ b/clang/lib/Basic/Targets/Lanai.h
@@ -59,8 +59,8 @@ class LLVM_LIBRARY_VISIBILITY LanaiTargetInfo : public TargetInfo {
MinGlobalAlign = 32;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool isValidCPUName(StringRef Name) const override;
diff --git a/clang/lib/Basic/Targets/LoongArch.cpp b/clang/lib/Basic/Targets/LoongArch.cpp
index cb3fd12c48ddb6..af0d42d2e6156f 100644
--- a/clang/lib/Basic/Targets/LoongArch.cpp
+++ b/clang/lib/Basic/Targets/LoongArch.cpp
@@ -184,7 +184,8 @@ LoongArchTargetInfo::convertConstraint(const char *&Constraint) const {
}
void LoongArchTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__loongarch__");
unsigned GRLen = getRegisterWidth();
Builder.defineMacro("__loongarch_grlen", Twine(GRLen));
diff --git a/clang/lib/Basic/Targets/LoongArch.h b/clang/lib/Basic/Targets/LoongArch.h
index c668ca7eca047a..f7b428adf9969c 100644
--- a/clang/lib/Basic/Targets/LoongArch.h
+++ b/clang/lib/Basic/Targets/LoongArch.h
@@ -59,8 +59,8 @@ class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
StringRef getABI() const override { return ABI; }
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
diff --git a/clang/lib/Basic/Targets/M68k.cpp b/clang/lib/Basic/Targets/M68k.cpp
index 8b8bf97d6f99a1..1300467b46ca9f 100644
--- a/clang/lib/Basic/Targets/M68k.cpp
+++ b/clang/lib/Basic/Targets/M68k.cpp
@@ -75,7 +75,8 @@ bool M68kTargetInfo::setCPU(const std::string &Name) {
}
void M68kTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
using llvm::Twine;
Builder.defineMacro("__m68k__");
diff --git a/clang/lib/Basic/Targets/M68k.h b/clang/lib/Basic/Targets/M68k.h
index b732add77e0340..c5e16e263bd55a 100644
--- a/clang/lib/Basic/Targets/M68k.h
+++ b/clang/lib/Basic/Targets/M68k.h
@@ -42,8 +42,8 @@ class LLVM_LIBRARY_VISIBILITY M68kTargetInfo : public TargetInfo {
public:
M68kTargetInfo(const llvm::Triple &Triple, const TargetOptions &);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
bool hasFeature(StringRef Feature) const override;
ArrayRef<const char *> getGCCRegNames() const override;
diff --git a/clang/lib/Basic/Targets/MSP430.cpp b/clang/lib/Basic/Targets/MSP430.cpp
index 844f5d3af70379..f7c236c4f708a3 100644
--- a/clang/lib/Basic/Targets/MSP430.cpp
+++ b/clang/lib/Basic/Targets/MSP430.cpp
@@ -26,7 +26,8 @@ ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
}
void MSP430TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("MSP430");
Builder.defineMacro("__MSP430__");
// FIXME: defines for different 'flavours' of MCU
diff --git a/clang/lib/Basic/Targets/MSP430.h b/clang/lib/Basic/Targets/MSP430.h
index 25639b8c1e0ad9..9da737dedd00c4 100644
--- a/clang/lib/Basic/Targets/MSP430.h
+++ b/clang/lib/Basic/Targets/MSP430.h
@@ -47,8 +47,8 @@ class LLVM_LIBRARY_VISIBILITY MSP430TargetInfo : public TargetInfo {
SigAtomicType = SignedLong;
resetDataLayout("e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override {
// FIXME: Implement.
diff --git a/clang/lib/Basic/Targets/Mips.cpp b/clang/lib/Basic/Targets/Mips.cpp
index 174bc9d2ab9967..acdec64c36243e 100644
--- a/clang/lib/Basic/Targets/Mips.cpp
+++ b/clang/lib/Basic/Targets/Mips.cpp
@@ -69,7 +69,8 @@ unsigned MipsTargetInfo::getISARev() const {
}
void MipsTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
if (BigEndian) {
DefineStd(Builder, "MIPSEB", Opts);
Builder.defineMacro("_MIPSEB");
diff --git a/clang/lib/Basic/Targets/Mips.h b/clang/lib/Basic/Targets/Mips.h
index 45425db3ac27ad..b68febb51d6b65 100644
--- a/clang/lib/Basic/Targets/Mips.h
+++ b/clang/lib/Basic/Targets/Mips.h
@@ -194,8 +194,8 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo {
unsigned getISARev() const;
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
diff --git a/clang/lib/Basic/Targets/NVPTX.cpp b/clang/lib/Basic/Targets/NVPTX.cpp
index 43b653dc52ce0d..d6b3c0b3abc265 100644
--- a/clang/lib/Basic/Targets/NVPTX.cpp
+++ b/clang/lib/Basic/Targets/NVPTX.cpp
@@ -170,7 +170,8 @@ bool NVPTXTargetInfo::hasFeature(StringRef Feature) const {
}
void NVPTXTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__PTX__");
Builder.defineMacro("__NVPTX__");
diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h
index 1ef20ce733917d..b10207f74561e2 100644
--- a/clang/lib/Basic/Targets/NVPTX.h
+++ b/clang/lib/Basic/Targets/NVPTX.h
@@ -70,8 +70,8 @@ class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {
NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
unsigned TargetPointerWidth);
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h
index a83d6464e789d6..e003859c6bf91d 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -27,9 +27,9 @@ class LLVM_LIBRARY_VISIBILITY OSTargetInfo : public TgtInfo {
OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: TgtInfo(Triple, Opts) {}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- TgtInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ TgtInfo::getTargetDefines(Opts, Builder, Diags);
getOSDefines(Opts, TgtInfo::getTriple(), Builder);
}
};
diff --git a/clang/lib/Basic/Targets/PNaCl.h b/clang/lib/Basic/Targets/PNaCl.h
index 595c4d83b1d1c3..281b902da4e760 100644
--- a/clang/lib/Basic/Targets/PNaCl.h
+++ b/clang/lib/Basic/Targets/PNaCl.h
@@ -43,8 +43,8 @@ class LLVM_LIBRARY_VISIBILITY PNaClTargetInfo : public TargetInfo {
void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const;
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
getArchDefines(Opts, Builder);
}
diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index 1448069173b5f4..7b1ec8697e38e0 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -288,7 +288,8 @@ static void defineXLCompatMacros(MacroBuilder &Builder) {
/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
/// #defines that are not tied to a specific subtarget.
void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
// We define the XLC compatibility macros only on AIX and Linux since XLC
// was never available on any other platforms.
diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h
index b0833d30550af4..66b0b49a6c7be0 100644
--- a/clang/lib/Basic/Targets/PPC.h
+++ b/clang/lib/Basic/Targets/PPC.h
@@ -191,8 +191,8 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
bool isCLZForZeroUndef() const override { return false; }
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool
initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp
index b6ea4440507ea1..d6f09ce70cbec6 100644
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -130,7 +130,8 @@ static unsigned getVersionValue(unsigned MajorVersion, unsigned MinorVersion) {
}
void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__riscv");
bool Is64Bit = getTriple().isRISCV64();
Builder.defineMacro("__riscv_xlen", Is64Bit ? "64" : "32");
diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h
index 8a2ee2cbee52b3..fc19c6ee9f286f 100644
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -59,8 +59,8 @@ class RISCVTargetInfo : public TargetInfo {
}
StringRef getABI() const override { return ABI; }
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
diff --git a/clang/lib/Basic/Targets/SPIR.cpp b/clang/lib/Basic/Targets/SPIR.cpp
index 040303983594f8..a53ff119fd9495 100644
--- a/clang/lib/Basic/Targets/SPIR.cpp
+++ b/clang/lib/Basic/Targets/SPIR.cpp
@@ -19,41 +19,48 @@ using namespace clang;
using namespace clang::targets;
void SPIRTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
DefineStd(Builder, "SPIR", Opts);
}
void SPIR32TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- SPIRTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ SPIRTargetInfo::getTargetDefines(Opts, Builder, Diags);
DefineStd(Builder, "SPIR32", Opts);
}
void SPIR64TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- SPIRTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ SPIRTargetInfo::getTargetDefines(Opts, Builder, Diags);
DefineStd(Builder, "SPIR64", Opts);
}
void BaseSPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
DefineStd(Builder, "SPIRV", Opts);
}
void SPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder, Diags);
}
void SPIRV32TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder, Diags);
DefineStd(Builder, "SPIRV32", Opts);
}
void SPIRV64TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder, Diags);
DefineStd(Builder, "SPIRV64", Opts);
}
@@ -86,8 +93,9 @@ ArrayRef<Builtin::Info> SPIRV64AMDGCNTargetInfo::getTargetBuiltins() const {
}
void SPIRV64AMDGCNTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder, Diags);
DefineStd(Builder, "SPIRV64", Opts);
Builder.defineMacro("__AMD__");
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 37cf9d7921bac5..572d5b024d626a 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -239,8 +239,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRTargetInfo : public BaseSPIRTargetInfo {
"SPIR target must use unknown environment type");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasFeature(StringRef Feature) const override {
return Feature == "spir";
@@ -262,8 +262,8 @@ class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo {
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
@@ -279,8 +279,8 @@ class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY BaseSPIRVTargetInfo : public BaseSPIRTargetInfo {
@@ -294,8 +294,8 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRVTargetInfo : public BaseSPIRTargetInfo {
return Feature == "spirv";
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
@@ -318,8 +318,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
@@ -339,8 +339,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
@@ -360,8 +360,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
"v96:128-v192:256-v256:256-v512:512-v1024:1024-G1");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY SPIRV64AMDGCNTargetInfo final
@@ -407,8 +407,8 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64AMDGCNTargetInfo final
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
void setAuxTarget(const TargetInfo *Aux) override;
diff --git a/clang/lib/Basic/Targets/Sparc.cpp b/clang/lib/Basic/Targets/Sparc.cpp
index d1a891092b0f5c..2410bf6a02238f 100644
--- a/clang/lib/Basic/Targets/Sparc.cpp
+++ b/clang/lib/Basic/Targets/Sparc.cpp
@@ -130,7 +130,8 @@ void SparcTargetInfo::fillValidCPUList(
}
void SparcTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
DefineStd(Builder, "sparc", Opts);
Builder.defineMacro("__REGISTER_PREFIX__", "");
@@ -139,8 +140,9 @@ void SparcTargetInfo::getTargetDefines(const LangOptions &Opts,
}
void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- SparcTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ SparcTargetInfo::getTargetDefines(Opts, Builder, Diags);
if (getTriple().isOSSolaris())
Builder.defineMacro("__sparcv8");
else {
@@ -163,8 +165,9 @@ void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
}
void SparcV9TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- SparcTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ SparcTargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("__sparcv9");
Builder.defineMacro("__arch64__");
// Solaris doesn't need these variants, but the BSDs do.
diff --git a/clang/lib/Basic/Targets/Sparc.h b/clang/lib/Basic/Targets/Sparc.h
index 3357bee33e1ac7..30c8671149d388 100644
--- a/clang/lib/Basic/Targets/Sparc.h
+++ b/clang/lib/Basic/Targets/Sparc.h
@@ -43,8 +43,8 @@ class LLVM_LIBRARY_VISIBILITY SparcTargetInfo : public TargetInfo {
SoftFloat = true;
return true;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasFeature(StringRef Feature) const override;
@@ -177,8 +177,8 @@ class LLVM_LIBRARY_VISIBILITY SparcV8TargetInfo : public SparcTargetInfo {
MaxAtomicInlineWidth = 32;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasBitIntType() const override { return true; }
};
@@ -218,8 +218,8 @@ class LLVM_LIBRARY_VISIBILITY SparcV9TargetInfo : public SparcTargetInfo {
MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool isValidCPUName(StringRef Name) const override {
return getCPUGeneration(SparcTargetInfo::getCPUKind(Name)) == CG_V9;
diff --git a/clang/lib/Basic/Targets/SystemZ.cpp b/clang/lib/Basic/Targets/SystemZ.cpp
index 06f08db2eadd47..2092de17b3333c 100644
--- a/clang/lib/Basic/Targets/SystemZ.cpp
+++ b/clang/lib/Basic/Targets/SystemZ.cpp
@@ -149,7 +149,8 @@ unsigned SystemZTargetInfo::getMinGlobalAlign(uint64_t Size,
}
void SystemZTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__s390__");
Builder.defineMacro("__s390x__");
Builder.defineMacro("__zarch__");
diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h
index f05ea473017bec..928a2aeada29ad 100644
--- a/clang/lib/Basic/Targets/SystemZ.h
+++ b/clang/lib/Basic/Targets/SystemZ.h
@@ -96,8 +96,8 @@ class LLVM_LIBRARY_VISIBILITY SystemZTargetInfo : public TargetInfo {
unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const override;
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
diff --git a/clang/lib/Basic/Targets/TCE.cpp b/clang/lib/Basic/Targets/TCE.cpp
index 91194b568a09f8..352ff0e842ecf8 100644
--- a/clang/lib/Basic/Targets/TCE.cpp
+++ b/clang/lib/Basic/Targets/TCE.cpp
@@ -18,14 +18,16 @@ using namespace clang;
using namespace clang::targets;
void TCETargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
DefineStd(Builder, "tce", Opts);
Builder.defineMacro("__TCE__");
Builder.defineMacro("__TCE_V1__");
}
void TCELETargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
DefineStd(Builder, "tcele", Opts);
Builder.defineMacro("__TCE__");
Builder.defineMacro("__TCE_V1__");
diff --git a/clang/lib/Basic/Targets/TCE.h b/clang/lib/Basic/Targets/TCE.h
index dcf684fe6dbc01..aea022884d5e59 100644
--- a/clang/lib/Basic/Targets/TCE.h
+++ b/clang/lib/Basic/Targets/TCE.h
@@ -90,8 +90,8 @@ class LLVM_LIBRARY_VISIBILITY TCETargetInfo : public TargetInfo {
UseAddrSpaceMapMangling = true;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
@@ -132,8 +132,8 @@ class LLVM_LIBRARY_VISIBILITY TCELETargetInfo : public TCETargetInfo {
"v1024:32:32-a0:0:32-n32");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
} // namespace targets
} // namespace clang
diff --git a/clang/lib/Basic/Targets/VE.cpp b/clang/lib/Basic/Targets/VE.cpp
index 67cae8faf60522..cdbf3a780ecca6 100644
--- a/clang/lib/Basic/Targets/VE.cpp
+++ b/clang/lib/Basic/Targets/VE.cpp
@@ -25,7 +25,8 @@ static constexpr Builtin::Info BuiltinInfo[] = {
};
void VETargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__ve", "1");
Builder.defineMacro("__ve__", "1");
Builder.defineMacro("__NEC__", "1");
diff --git a/clang/lib/Basic/Targets/VE.h b/clang/lib/Basic/Targets/VE.h
index 7e8fdf6096ef23..b88d33855cee91 100644
--- a/clang/lib/Basic/Targets/VE.h
+++ b/clang/lib/Basic/Targets/VE.h
@@ -50,8 +50,8 @@ class LLVM_LIBRARY_VISIBILITY VETargetInfo : public TargetInfo {
"v1024:64:64-v2048:64:64-v4096:64:64-v8192:64:64-v16384:64:64");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
bool hasSjLjLowering() const override { return true; }
diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp
index 5ac9421663adea..7eaaf87335068b 100644
--- a/clang/lib/Basic/Targets/WebAssembly.cpp
+++ b/clang/lib/Basic/Targets/WebAssembly.cpp
@@ -72,7 +72,8 @@ void WebAssemblyTargetInfo::fillValidCPUList(
}
void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
if (HasAtomics)
Builder.defineMacro("__wasm_atomics__");
@@ -320,13 +321,15 @@ void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags,
}
void WebAssembly32TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ WebAssemblyTargetInfo::getTargetDefines(Opts, Builder, Diags);
defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
}
void WebAssembly64TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
- WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
+ WebAssemblyTargetInfo::getTargetDefines(Opts, Builder, Diags);
defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
}
diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h
index 213ec42ca84bb7..fb1e7583af1b08 100644
--- a/clang/lib/Basic/Targets/WebAssembly.h
+++ b/clang/lib/Basic/Targets/WebAssembly.h
@@ -93,8 +93,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
bool useFP16ConversionIntrinsics() const override { return !HasFP16; }
protected:
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
private:
static void setSIMDLevel(llvm::StringMap<bool> &Features, SIMDEnum Level,
@@ -187,8 +187,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo
}
protected:
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
class LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo
@@ -211,8 +211,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo
}
protected:
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
};
} // namespace targets
} // namespace clang
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index 5448bd841959f4..fa2fe682ac57dc 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -522,7 +522,8 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
/// definitions for this particular subtarget.
void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
// Inline assembly supports X86 flag outputs.
Builder.defineMacro("__GCC_ASM_FLAG_OUTPUTS__");
diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h
index 58344a2ad3227a..3af20f6427b2fb 100644
--- a/clang/lib/Basic/Targets/X86.h
+++ b/clang/lib/Basic/Targets/X86.h
@@ -319,8 +319,8 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {
return false;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
bool Enabled) const final;
@@ -587,9 +587,9 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_32TargetInfo
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder, Diags);
// The value of the following reflects processor type.
// 300=386, 400=486, 500=Pentium, 600=Blend (default)
// We lost the original triple, so we use the default.
@@ -606,9 +606,9 @@ class LLVM_LIBRARY_VISIBILITY MinGWX86_32TargetInfo
HasFloat128 = true;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("_X86_");
}
};
@@ -625,9 +625,9 @@ class LLVM_LIBRARY_VISIBILITY CygwinX86_32TargetInfo : public X86_32TargetInfo {
"_");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- X86_32TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ X86_32TargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("_X86_");
Builder.defineMacro("__CYGWIN__");
Builder.defineMacro("__CYGWIN32__");
@@ -645,9 +645,9 @@ class LLVM_LIBRARY_VISIBILITY HaikuX86_32TargetInfo
HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("__INTEL__");
}
};
@@ -670,9 +670,9 @@ class LLVM_LIBRARY_VISIBILITY MCUX86_32TargetInfo : public X86_32TargetInfo {
return CC == CC_C ? CCCR_OK : CCCR_Warning;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- X86_32TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ X86_32TargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("__iamcu");
Builder.defineMacro("__iamcu__");
}
@@ -690,9 +690,9 @@ class LLVM_LIBRARY_VISIBILITY RTEMSX86_32TargetInfo : public X86_32TargetInfo {
PtrDiffType = SignedLong;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- X86_32TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ X86_32TargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("__INTEL__");
Builder.defineMacro("__rtems__");
}
@@ -823,8 +823,8 @@ class LLVM_LIBRARY_VISIBILITY UEFIX86_64TargetInfo
"i64:64-i128:128-f80:128-n8:16:32:64-S128");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
getOSDefines(Opts, X86TargetInfo::getTriple(), Builder);
}
@@ -902,9 +902,9 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_64TargetInfo
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("_M_X64", "100");
Builder.defineMacro("_M_AMD64", "100");
}
@@ -938,9 +938,9 @@ class LLVM_LIBRARY_VISIBILITY CygwinX86_64TargetInfo : public X86_64TargetInfo {
TLSSupported = false;
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override {
- X86_64TargetInfo::getTargetDefines(Opts, Builder);
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override {
+ X86_64TargetInfo::getTargetDefines(Opts, Builder, Diags);
Builder.defineMacro("__x86_64__");
Builder.defineMacro("__CYGWIN__");
Builder.defineMacro("__CYGWIN64__");
diff --git a/clang/lib/Basic/Targets/XCore.cpp b/clang/lib/Basic/Targets/XCore.cpp
index fd377bbfb90e16..887367e033520a 100644
--- a/clang/lib/Basic/Targets/XCore.cpp
+++ b/clang/lib/Basic/Targets/XCore.cpp
@@ -27,7 +27,8 @@ static constexpr Builtin::Info BuiltinInfo[] = {
};
void XCoreTargetInfo::getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const {
Builder.defineMacro("__xcore__");
Builder.defineMacro("__XS1B__");
}
diff --git a/clang/lib/Basic/Targets/XCore.h b/clang/lib/Basic/Targets/XCore.h
index a58d3e8acf4791..9def027dd1dac6 100644
--- a/clang/lib/Basic/Targets/XCore.h
+++ b/clang/lib/Basic/Targets/XCore.h
@@ -40,8 +40,8 @@ class LLVM_LIBRARY_VISIBILITY XCoreTargetInfo : public TargetInfo {
"-f64:32-a:0:32-n32");
}
- void getTargetDefines(const LangOptions &Opts,
- MacroBuilder &Builder) const override;
+ void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) const override;
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 9a0fdb175ff29e..8e1ae06d204814 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -852,7 +852,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
const LangOptions &LangOpts,
const FrontendOptions &FEOpts,
const PreprocessorOptions &PPOpts,
- MacroBuilder &Builder) {
+ MacroBuilder &Builder,
+ DiagnosticsEngine &Diags) {
// Compiler version introspection macros.
Builder.defineMacro("__llvm__"); // LLVM Backend
Builder.defineMacro("__clang__"); // Clang Frontend
@@ -1509,7 +1510,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
}
// Get other target #defines.
- TI.getTargetDefines(LangOpts, Builder);
+ TI.getTargetDefines(LangOpts, Builder, Diags);
}
static void InitializePGOProfileMacros(const CodeGenOptions &CodeGenOpts,
@@ -1547,10 +1548,12 @@ void clang::InitializePreprocessor(Preprocessor &PP,
LangOpts.SYCLIsDevice) &&
PP.getAuxTargetInfo())
InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts,
- PP.getPreprocessorOpts(), Builder);
+ PP.getPreprocessorOpts(), Builder,
+ PP.getDiagnostics());
InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts,
- PP.getPreprocessorOpts(), Builder);
+ PP.getPreprocessorOpts(), Builder,
+ PP.getDiagnostics());
// Install definitions to make Objective-C++ ARC work well with various
// C++ Standard Library implementations.
>From 9addd946958d072ff5f21044461fde27fa626770 Mon Sep 17 00:00:00 2001
From: Ming-Yi Lai <ming-yi.lai at mediatek.com>
Date: Fri, 10 May 2024 14:16:59 +0800
Subject: [PATCH 4/4] [clang][RISCV] Add Zicfilp CFI scheme preprocessor macros
These macros allow assembly files to know which CFI label to use when the target
has Zicfilp enabled.
---
clang/lib/Basic/Targets/RISCV.cpp | 28 ++++++
.../test/CodeGen/RISCV/riscv-cf-protection.c | 99 +++++++++++++------
2 files changed, 95 insertions(+), 32 deletions(-)
diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp
index d6f09ce70cbec6..32fb2e003a4a71 100644
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -225,6 +225,34 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
else
Builder.defineMacro("__riscv_32e");
}
+
+ if (Opts.CFProtectionBranch) {
+ if (checkCFProtectionBranchSupported()) {
+ auto Scheme = Opts.getCFBranchLabelScheme();
+ if (checkCFBranchLabelSchemeSupported(Scheme)) {
+ if (Scheme == CFBranchLabelSchemeKind::Default)
+ Scheme = getDefaultCFBranchLabelScheme();
+
+ Builder.defineMacro("__riscv_landing_pad", "1");
+ switch (Scheme) {
+ case CFBranchLabelSchemeKind::Unlabeled:
+ Builder.defineMacro("__riscv_landing_pad_unlabeled", "1");
+ break;
+ case CFBranchLabelSchemeKind::FuncSig:
+ Builder.defineMacro("__riscv_landing_pad_func_sig", "1");
+ break;
+ case CFBranchLabelSchemeKind::Default:
+ llvm_unreachable("default cf-branch-label scheme should already be "
+ "transformed to other scheme");
+ }
+ } else
+ Diags.Report(diag::err_opt_not_valid_on_target)
+ << (Twine("-mcf-branch-label-scheme=") +
+ getCFBranchLabelSchemeFlagVal(Scheme))
+ .str();
+ } else
+ Diags.Report(diag::err_opt_not_valid_on_target) << "cf-protection=branch";
+ }
}
static constexpr Builtin::Info BuiltinInfo[] = {
diff --git a/clang/test/CodeGen/RISCV/riscv-cf-protection.c b/clang/test/CodeGen/RISCV/riscv-cf-protection.c
index 02a22006b1638f..4de45e0c4ef416 100644
--- a/clang/test/CodeGen/RISCV/riscv-cf-protection.c
+++ b/clang/test/CodeGen/RISCV/riscv-cf-protection.c
@@ -1,55 +1,90 @@
+// Default cf-branch-label-scheme is func-sig
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
-// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch -E -dM %s -o - \
+// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch -E -dM %s -o - \
+// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - \
+// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-UNLABELED %s
// RUN: %clang --target=riscv32 -menable-experimental-extensions \
-// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - \
+// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
+
+// RUN: %clang --target=riscv32 -menable-experimental-extensions \
+// RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
// RUN: not %clang --target=riscv32 -fcf-protection=branch \
-// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
// RUN: not %clang --target=riscv32 -fcf-protection=branch \
-// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
+
+// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
-// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
-// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - \
+// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-UNLABELED %s
+
+// RUN: %clang --target=riscv64 -menable-experimental-extensions \
+// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \
+// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - \
+// RUN: | FileCheck --check-prefix=CHECK-ZICFILP-FUNC-SIG %s
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
-// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
// RUN: %clang --target=riscv64 -menable-experimental-extensions \
-// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
// RUN: not %clang --target=riscv64 -fcf-protection=branch \
-// RUN: -mcf-branch-label-scheme=unlabeled -c %s -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
// RUN: not %clang --target=riscv64 -fcf-protection=branch \
-// RUN: -mcf-branch-label-scheme=func-sig -c %s -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-BRANCH-PROT-INVALID %s
+// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-BRANCH-PROT-INVALID %s
-// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-UNLABELED-SCHEME-UNUSED %s
+// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-UNLABELED-SCHEME-UNUSED %s
-// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -c %s \
-// RUN: -o /dev/null 2>&1 \
-// RUN: | FileCheck --check-prefix=CHECK-FUNC-SIG-SCHEME-UNUSED %s
+// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \
+// RUN: -o - 2>&1 | FileCheck \
+// RUN: --check-prefixes=CHECK-NO-MACRO,CHECK-FUNC-SIG-SCHEME-UNUSED %s
+// CHECK-ZICFILP-UNLABELED: __riscv_landing_pad 1{{$}}
+// CHECK-ZICFILP-UNLABELED: __riscv_landing_pad_unlabeled 1{{$}}
+// CHECK-ZICFILP-FUNC-SIG: __riscv_landing_pad 1{{$}}
+// CHECK-ZICFILP-FUNC-SIG: __riscv_landing_pad_func_sig 1{{$}}
+// CHECK-NO-MACRO-NOT: __riscv_landing_pad
+// CHECK-NO-MACRO-NOT: __riscv_landing_pad_unlabeled
+// CHECK-NO-MACRO-NOT: __riscv_landing_pad_func_sig
// CHECK-BRANCH-PROT-INVALID: error: option 'cf-protection=branch' cannot be
// CHECK-BRANCH-PROT-INVALID-SAME: specified on this target
// CHECK-UNLABELED-SCHEME-UNUSED: warning: argument unused during compilation:
More information about the cfe-commits
mailing list