Skip to content

Commit 6e2d67e

Browse files
authored
[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]: riscv-non-isa/riscv-c-api-doc#40
1 parent 897cc8a commit 6e2d67e

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,11 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
210210
if (VScale && VScale->first && VScale->first == VScale->second)
211211
Builder.defineMacro("__riscv_v_fixed_vlen",
212212
Twine(VScale->first * llvm::RISCV::RVVBitsPerBlock));
213+
214+
if (FastUnalignedAccess)
215+
Builder.defineMacro("__riscv_misaligned_fast");
216+
else
217+
Builder.defineMacro("__riscv_misaligned_avoid");
213218
}
214219

215220
static constexpr Builtin::Info BuiltinInfo[] = {
@@ -328,6 +333,8 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
328333
if (ISAInfo->hasExtension("zfh") || ISAInfo->hasExtension("zhinx"))
329334
HasLegalHalfType = true;
330335

336+
FastUnalignedAccess = llvm::is_contained(Features, "+unaligned-scalar-mem");
337+
331338
return true;
332339
}
333340

clang/lib/Basic/Targets/RISCV.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class RISCVTargetInfo : public TargetInfo {
2929
std::string ABI, CPU;
3030
std::unique_ptr<llvm::RISCVISAInfo> ISAInfo;
3131

32+
private:
33+
bool FastUnalignedAccess;
34+
3235
public:
3336
RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
3437
: TargetInfo(Triple) {

clang/test/Preprocessor/riscv-target-features.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,3 +1246,15 @@
12461246
// RUN: -march=rv64i_zve32x_zvkt1p0 -x c -E -dM %s \
12471247
// RUN: -o - | FileCheck --check-prefix=CHECK-ZVKT-EXT %s
12481248
// CHECK-ZVKT-EXT: __riscv_zvkt 1000000{{$}}
1249+
1250+
// RUN: %clang --target=riscv32-unknown-linux-gnu -march=rv32i -x c -E -dM %s \
1251+
// RUN: -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-AVOID
1252+
// RUN: %clang --target=riscv64-unknown-linux-gnu -march=rv64i -x c -E -dM %s \
1253+
// RUN: -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-AVOID
1254+
// CHECK-MISALIGNED-AVOID: __riscv_misaligned_avoid 1
1255+
1256+
// RUN: %clang --target=riscv32-unknown-linux-gnu -march=rv32i -E -dM %s \
1257+
// RUN: -munaligned-access -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-FAST
1258+
// RUN: %clang --target=riscv64-unknown-linux-gnu -march=rv64i -E -dM %s \
1259+
// RUN: -munaligned-access -o - | FileCheck %s --check-prefix=CHECK-MISALIGNED-FAST
1260+
// CHECK-MISALIGNED-FAST: __riscv_misaligned_fast 1

0 commit comments

Comments
 (0)