diff --git a/clang/lib/Basic/Targets/RISCV.h b/clang/lib/Basic/Targets/RISCV.h --- a/clang/lib/Basic/Targets/RISCV.h +++ b/clang/lib/Basic/Targets/RISCV.h @@ -23,6 +23,8 @@ // RISC-V Target class RISCVTargetInfo : public TargetInfo { + void setAtomic(); + protected: std::string ABI; bool HasM; diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp --- a/clang/lib/Basic/Targets/RISCV.cpp +++ b/clang/lib/Basic/Targets/RISCV.cpp @@ -131,6 +131,13 @@ .Default(false); } +void RISCVTargetInfo::setAtomic() { + bool Is64Bit = getTriple().getArch() == llvm::Triple::riscv64; + + MaxAtomicPromoteWidth = Is64Bit ? 64 : 32; + MaxAtomicInlineWidth = Is64Bit ? 64 : 32; +} + /// Perform initialization based on the user configured set of features. bool RISCVTargetInfo::handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) { @@ -147,5 +154,7 @@ HasC = true; } + setAtomic(); + return true; } diff --git a/clang/test/CodeGen/atomic-ops-riscv.c b/clang/test/CodeGen/atomic-ops-riscv.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/atomic-ops-riscv.c @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=riscv32 | FileCheck %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=riscv64 | FileCheck %s +// REQUIRES: riscv-registered-target + +#ifndef ALREADY_INCLUDED +#define ALREADY_INCLUDED + +#include + +// Note: this test is based off atomic-ops.c. +// TODO: Add more tests. +// +// Basic IRGen tests for __c11_atomic_* and GNU __atomic_* + +int fi1(_Atomic(int) *i) { + // CHECK-LABEL: @fi1 + // CHECK: load atomic i32, i32* {{.*}} seq_cst + return __c11_atomic_load(i, memory_order_seq_cst); +} + +int fi1a(int *i) { + // CHECK-LABEL: @fi1a + // CHECK: load atomic i32, i32* {{.*}} seq_cst + int v; + __atomic_load(i, &v, memory_order_seq_cst); + return v; +} + +int fi1b(int *i) { + // CHECK-LABEL: @fi1b + // CHECK: load atomic i32, i32* {{.*}} seq_cst + return __atomic_load_n(i, memory_order_seq_cst); +} + +#endif