Author: Yeting Kuo Date: 2023-10-26T15:10:57+08:00 New Revision: 6e2d67e7d66f46fbe4f4c35c7c59d3a8706ea8b0
URL: https://github.com/llvm/llvm-project/commit/6e2d67e7d66f46fbe4f4c35c7c59d3a8706ea8b0 DIFF: https://github.com/llvm/llvm-project/commit/6e2d67e7d66f46fbe4f4c35c7c59d3a8706ea8b0.diff LOG: [RISCV] Support predefined macro __riscv_misaligned_[fast,avoid]. (#65756) RISC-V C API introduced predefined macro to achieve hints about unaligned accesses ([pr]). This patch defines __riscv_misaligned_fast when using -mno-strict-align, otherwise, defines __riscv_misaligned_avoid. Note: This ignores __riscv_misaligned_slow which is also defined by spec. [pr]: https://github.com/riscv-non-isa/riscv-c-api-doc/pull/40 Added: Modified: clang/lib/Basic/Targets/RISCV.cpp clang/lib/Basic/Targets/RISCV.h clang/test/Preprocessor/riscv-target-features.c Removed: ################################################################################ diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp index 5f75619b745546c..0b9ebeaf5e75bbd 100644 --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -210,6 +210,11 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, if (VScale && VScale->first && VScale->first == VScale->second) Builder.defineMacro("__riscv_v_fixed_vlen", Twine(VScale->first * llvm::RISCV::RVVBitsPerBlock)); + + if (FastUnalignedAccess) + Builder.defineMacro("__riscv_misaligned_fast"); + else + Builder.defineMacro("__riscv_misaligned_avoid"); } static constexpr Builtin::Info BuiltinInfo[] = { @@ -328,6 +333,8 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, if (ISAInfo->hasExtension("zfh") || ISAInfo->hasExtension("zhinx")) HasLegalHalfType = true; + FastUnalignedAccess = llvm::is_contained(Features, "+unaligned-scalar-mem"); + return true; } diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h index 6be0e49ca2f5525..e5424d318401fb0 100644 --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -29,6 +29,9 @@ class RISCVTargetInfo : public TargetInfo { std::string ABI, CPU; std::unique_ptr<llvm::RISCVISAInfo> ISAInfo; +private: + bool FastUnalignedAccess; + public: RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple) { diff --git a/clang/test/Preprocessor/riscv-target-features.c b/clang/test/Preprocessor/riscv-target-features.c index ffdec34ca615fe3..3a0435f9c97906f 100644 --- a/clang/test/Preprocessor/riscv-target-features.c +++ b/clang/test/Preprocessor/riscv-target-features.c @@ -1246,3 +1246,15 @@ // RUN: -march=rv64i_zve32x_zvkt1p0 -x c -E -dM %s \ // RUN: -o - | FileCheck --check-prefix=CHECK-ZVKT-EXT %s // CHECK-ZVKT-EXT: __riscv_zvkt 1000000{{$}} + +// RUN: %clang --target=riscv32-unknown-linux-gnu -march=rv32i -x c -E -dM %s \ +// RUN: -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-AVOID +// RUN: %clang --target=riscv64-unknown-linux-gnu -march=rv64i -x c -E -dM %s \ +// RUN: -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-AVOID +// CHECK-MISALIGNED-AVOID: __riscv_misaligned_avoid 1 + +// RUN: %clang --target=riscv32-unknown-linux-gnu -march=rv32i -E -dM %s \ +// RUN: -munaligned-access -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-FAST +// RUN: %clang --target=riscv64-unknown-linux-gnu -march=rv64i -E -dM %s \ +// RUN: -munaligned-access -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-FAST +// CHECK-MISALIGNED-FAST: __riscv_misaligned_fast 1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits