Skip to content

Commit 16c5c69

Browse files
authored
Merge pull request #4175 from laytan/riscv-compiler
Support RISC-V for the compiler itself
2 parents 39b49cb + 28c643d commit 16c5c69

File tree

5 files changed

+34
-4
lines changed

5 files changed

+34
-4
lines changed

src/bug_report.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ gb_internal void report_windows_product_type(DWORD ProductType) {
155155
#endif
156156

157157
gb_internal void odin_cpuid(int leaf, int result[]) {
158-
#if defined(GB_CPU_ARM)
158+
#if defined(GB_CPU_ARM) || defined(GB_CPU_RISCV)
159159
return;
160160

161161
#elif defined(GB_CPU_X86)
@@ -225,6 +225,12 @@ gb_internal void report_cpu_info() {
225225
gb_printf("ARM\n");
226226
#endif
227227
}
228+
#elif defined(GB_CPU_RISCV)
229+
#if defined(GB_ARCH_64_BIT)
230+
gb_printf("RISCV64\n");
231+
#else
232+
gb_printf("RISCV32\n");
233+
#endif
228234
#else
229235
gb_printf("Unknown\n");
230236
#endif

src/build_settings.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -1525,6 +1525,8 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
15251525
metrics = &target_haiku_amd64;
15261526
#elif defined(GB_CPU_ARM)
15271527
metrics = &target_linux_arm64;
1528+
#elif defined(GB_CPU_RISCV)
1529+
metrics = &target_linux_riscv64;
15281530
#else
15291531
metrics = &target_linux_amd64;
15301532
#endif
@@ -1647,7 +1649,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
16471649

16481650
// Disallow on wasm
16491651
bc->use_separate_modules = false;
1650-
} if(bc->metrics.arch == TargetArch_riscv64) {
1652+
} if(bc->metrics.arch == TargetArch_riscv64 && bc->cross_compiling) {
16511653
bc->link_flags = str_lit("-target riscv64 ");
16521654
} else {
16531655
// NOTE: for targets other than darwin, we don't specify a `-target` link flag.

src/gb/gb.h

+15-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ extern "C" {
3939
#endif
4040
#endif
4141

42-
#if defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__) || defined(__aarch64__)
42+
#if defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__) || defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64)
4343
#ifndef GB_ARCH_64_BIT
4444
#define GB_ARCH_64_BIT 1
4545
#endif
@@ -144,6 +144,13 @@ extern "C" {
144144
#define GB_CACHE_LINE_SIZE 64
145145
#endif
146146

147+
#elif defined(__riscv)
148+
#ifndef GB_CPU_RISCV
149+
#define GB_CPU_RISCV 1
150+
#endif
151+
#ifndef GB_CACHE_LINE_SIZE
152+
#define GB_CACHE_LINE_SIZE 64
153+
#endif
147154
#else
148155
#error Unknown CPU Type
149156
#endif
@@ -2562,7 +2569,7 @@ gb_inline void *gb_memcopy(void *dest, void const *source, isize n) {
25622569

25632570
void *dest_copy = dest;
25642571
__asm__ __volatile__("rep movsb" : "+D"(dest_copy), "+S"(source), "+c"(n) : : "memory");
2565-
#elif defined(GB_CPU_ARM)
2572+
#elif defined(GB_CPU_ARM) || defined(GB_CPU_RISCV)
25662573
u8 *s = cast(u8 *)source;
25672574
u8 *d = cast(u8 *)dest;
25682575
for (isize i = 0; i < n; i++) {
@@ -6267,6 +6274,12 @@ gb_no_inline isize gb_snprintf_va(char *text, isize max_len, char const *fmt, va
62676274
asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value));
62686275
return virtual_timer_value;
62696276
}
6277+
#elif defined(__riscv)
6278+
gb_inline u64 gb_rdtsc(void) {
6279+
u64 result = 0;
6280+
__asm__ volatile("rdcycle %0" : "=r"(result));
6281+
return result;
6282+
}
62706283
#else
62716284
#warning "gb_rdtsc not supported"
62726285
gb_inline u64 gb_rdtsc(void) { return 0; }

src/main.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -3252,6 +3252,12 @@ int main(int arg_count, char const **arg_ptr) {
32523252
gb_printf_err("missing required target feature: \"%.*s\", enable it by setting a different -microarch or explicitly adding it through -target-features\n", LIT(disabled));
32533253
gb_exit(1);
32543254
}
3255+
3256+
// NOTE(laytan): some weird errors on LLVM 14 that LLVM 17 fixes.
3257+
if (LLVM_VERSION_MAJOR < 17) {
3258+
gb_printf_err("Invalid LLVM version %s, RISC-V targets require at least LLVM 17\n", LLVM_VERSION_STRING);
3259+
gb_exit(1);
3260+
}
32553261
}
32563262

32573263
if (build_context.show_debug_messages) {

src/threading.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,9 @@ gb_internal gb_inline void yield_thread(void) {
529529
_mm_pause();
530530
#elif defined(GB_CPU_ARM)
531531
__asm__ volatile ("yield" : : : "memory");
532+
#elif defined(GB_CPU_RISCV)
533+
// I guess?
534+
__asm__ volatile ("nop" : : : "memory");
532535
#else
533536
#error Unknown architecture
534537
#endif

0 commit comments

Comments
 (0)