diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index a1a2437f288a0..6c83bf4576bf8 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -241,6 +241,25 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, if (Opts.CFProtectionReturn && ISAInfo->hasExtension("zicfiss")) Builder.defineMacro("__riscv_shadow_stack"); + + if (Opts.CFProtectionBranch) { + auto Scheme = Opts.getCFBranchLabelScheme(); + if (Scheme == CFBranchLabelSchemeKind::Default) + Scheme = getDefaultCFBranchLabelScheme(); + + Builder.defineMacro("__riscv_landing_pad"); + switch (Scheme) { + case CFBranchLabelSchemeKind::Unlabeled: + Builder.defineMacro("__riscv_landing_pad_unlabeled"); + break; + case CFBranchLabelSchemeKind::FuncSig: + // TODO: Define macros after the func-sig scheme is implemented + break; + case CFBranchLabelSchemeKind::Default: + llvm_unreachable("default cf-branch-label scheme should already be " + "transformed to other scheme"); + } + } } static constexpr int NumRVVBuiltins = diff --git a/clang/test/Preprocessor/riscv-cf-protection-branch.c b/clang/test/Preprocessor/riscv-cf-protection-branch.c new file mode 100644 index 0000000000000..f658e0a8c6c0f --- /dev/null +++ b/clang/test/Preprocessor/riscv-cf-protection-branch.c @@ -0,0 +1,83 @@ +// RUN: %clang --target=riscv32 -menable-experimental-extensions \ +// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv32 -menable-experimental-extensions \ +// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=full \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv32 -menable-experimental-extensions \ +// RUN: -march=rv32i_zicfilp1p0 -E -dM %s -o - 2>&1 | \ +// RUN: FileCheck --check-prefixes=NO-MACRO %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 --check-prefixes=NO-MACRO %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 --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv32 -fcf-protection=branch \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \ +// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv32 -fcf-protection=full \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM -emit-llvm %s -o - | \ +// RUN: FileCheck --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv32 -E -dM %s -o - 2>&1 | \ +// RUN: FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %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 - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv64 -menable-experimental-extensions \ +// RUN: -march=rv64i_zicfilp1p0 -fcf-protection=full \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv64 -menable-experimental-extensions \ +// RUN: -march=rv64i_zicfilp1p0 -E -dM %s -o - 2>&1 | \ +// RUN: FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv64 -menable-experimental-extensions \ +// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv64 -menable-experimental-extensions \ +// RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv64 -fcf-protection=branch \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv64 -fcf-protection=full \ +// RUN: -mcf-branch-label-scheme=unlabeled -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + +// RUN: %clang --target=riscv64 -E -dM %s -o - 2>&1 | \ +// RUN: FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s + +// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck --check-prefixes=NO-MACRO %s + +// LPAD-MACRO: __riscv_landing_pad 1{{$}} +// UNLABELED-MACRO: __riscv_landing_pad_unlabeled 1{{$}} +// NO-MACRO-NOT: __riscv_landing_pad +// NO-MACRO-NOT: __riscv_landing_pad_unlabeled +// NO-MACRO-NOT: __riscv_landing_pad_func_sig