From 35532cf0a9cc855fe5f0a4eefd4c343687a595dc Mon Sep 17 00:00:00 2001 From: Ming-Yi Lai Date: Fri, 10 May 2024 14:16:59 +0800 Subject: [PATCH] [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 | 19 +++++ .../test/CodeGen/RISCV/riscv-cf-protection.c | 79 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index b6ea4440507ea1..b9199e3bc77d34 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -224,6 +224,25 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, else Builder.defineMacro("__riscv_32e"); } + + if (Opts.CFProtectionBranch) { + auto Scheme = Opts.getCFBranchLabelScheme(); + 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"); + } + } } 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 3a9855a3d2f011..db7b65061658c0 100644 --- a/clang/test/CodeGen/RISCV/riscv-cf-protection.c +++ b/clang/test/CodeGen/RISCV/riscv-cf-protection.c @@ -1,71 +1,143 @@ +// 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=branch \ // RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s +// RUN: %clang --target=riscv32 -menable-experimental-extensions \ +// RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \ +// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s + // RUN: %clang --target=riscv32 -menable-experimental-extensions \ // RUN: -march=rv32i_zicfilp1p0 -fcf-protection=branch \ // RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %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=NO-MACRO,UNLABELED-SCHEME-UNUSED %s + // RUN: %clang --target=riscv32 -menable-experimental-extensions \ // RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,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=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s + // RUN: %clang --target=riscv32 -menable-experimental-extensions \ // RUN: -march=rv32i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %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=branch \ // RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s +// RUN: %clang --target=riscv32 -fcf-protection=branch \ +// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s + // RUN: %clang --target=riscv32 -fcf-protection=branch \ // RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %s +// RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck \ +// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s + // RUN: %clang --target=riscv32 -mcf-branch-label-scheme=unlabeled -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,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=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s + // RUN: %clang --target=riscv32 -mcf-branch-label-scheme=func-sig -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,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 - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,UNLABELED-MACRO %s + // RUN: %clang --target=riscv64 -menable-experimental-extensions \ // RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \ // RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %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 - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s + // RUN: %clang --target=riscv64 -menable-experimental-extensions \ // RUN: -march=rv64i_zicfilp1p0 -fcf-protection=branch \ // RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %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 \ +// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s + // RUN: %clang --target=riscv64 -menable-experimental-extensions \ // RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=unlabeled -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,UNLABELED-SCHEME-UNUSED %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 \ +// RUN: --check-prefixes=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s + // RUN: %clang --target=riscv64 -menable-experimental-extensions \ // RUN: -march=rv64i_zicfilp1p0 -mcf-branch-label-scheme=func-sig -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %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=branch \ // RUN: -mcf-branch-label-scheme=unlabeled -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,UNLABELED-FLAG %s +// RUN: %clang --target=riscv64 -fcf-protection=branch \ +// RUN: -mcf-branch-label-scheme=func-sig -E -dM %s -o - | FileCheck \ +// RUN: --check-prefixes=LPAD-MACRO,FUNC-SIG-MACRO %s + // RUN: %clang --target=riscv64 -fcf-protection=branch \ // RUN: -mcf-branch-label-scheme=func-sig -S -emit-llvm %s -o - | FileCheck \ // RUN: --check-prefixes=BRANCH-PROT-FLAG,FUNC-SIG-FLAG %s +// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck \ +// RUN: --check-prefixes=NO-MACRO,UNLABELED-SCHEME-UNUSED %s + // RUN: %clang --target=riscv64 -mcf-branch-label-scheme=unlabeled -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,UNLABELED-SCHEME-UNUSED %s +// RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -E -dM %s \ +// RUN: -o - 2>&1 | FileCheck \ +// RUN: --check-prefixes=NO-MACRO,FUNC-SIG-SCHEME-UNUSED %s + // RUN: %clang --target=riscv64 -mcf-branch-label-scheme=func-sig -S \ // RUN: -emit-llvm %s -o - 2>&1 | FileCheck \ // RUN: --check-prefixes=NO-FLAG,FUNC-SIG-SCHEME-UNUSED %s @@ -83,6 +155,13 @@ // FUNC-SIG-SCHEME-UNUSED: warning: argument unused during compilation: // FUNC-SIG-SCHEME-UNUSED-SAME: '-mcf-branch-label-scheme=func-sig' +// LPAD-MACRO: __riscv_landing_pad 1{{$}} +// UNLABELED-MACRO: __riscv_landing_pad_unlabeled 1{{$}} +// FUNC-SIG-MACRO: __riscv_landing_pad_func_sig 1{{$}} +// NO-MACRO-NOT: __riscv_landing_pad +// NO-MACRO-NOT: __riscv_landing_pad_unlabeled +// NO-MACRO-NOT: __riscv_landing_pad_func_sig + // BRANCH-PROT-FLAG-DAG: [[P_FLAG:![0-9]+]] = !{i32 8, !"cf-protection-branch", i32 1} // UNLABELED-FLAG-DAG: [[S_FLAG:![0-9]+]] = !{i32 1, !"cf-branch-label-scheme", !"unlabeled"} // FUNC-SIG-FLAG-DAG: [[S_FLAG:![0-9]+]] = !{i32 1, !"cf-branch-label-scheme", !"func-sig"}