Merge pull request #3570 from jasonKercher/linux-arm32

Get the compiler to build and work on arm32 Linux
This commit is contained in:
gingerBill
2024-05-20 00:05:57 +01:00
committed by GitHub
6 changed files with 27 additions and 8 deletions
+5 -1
View File
@@ -801,6 +801,10 @@ truncsfhf2 :: proc "c" (value: f32) -> __float16 {
} }
} }
@(link_name="__aeabi_d2h", linkage=RUNTIME_LINKAGE, require=RUNTIME_REQUIRE)
aeabi_d2h :: proc "c" (value: f64) -> __float16 {
return truncsfhf2(f32(value))
}
@(link_name="__truncdfhf2", linkage=RUNTIME_LINKAGE, require=RUNTIME_REQUIRE) @(link_name="__truncdfhf2", linkage=RUNTIME_LINKAGE, require=RUNTIME_REQUIRE)
truncdfhf2 :: proc "c" (value: f64) -> __float16 { truncdfhf2 :: proc "c" (value: f64) -> __float16 {
@@ -1055,4 +1059,4 @@ __read_bits :: proc "contextless" (dst, src: [^]byte, offset: uintptr, size: uin
dst[j>>3] &~= 1<<(j&7) dst[j>>3] &~= 1<<(j&7)
dst[j>>3] |= the_bit<<(j&7) dst[j>>3] |= the_bit<<(j&7)
} }
} }
+1 -1
View File
@@ -251,7 +251,7 @@ gb_internal void report_ram_info() {
int result = sysinfo(&info); int result = sysinfo(&info);
if (result == 0x0) { if (result == 0x0) {
gb_printf("%lu MiB\n", info.totalram * info.mem_unit / gb_megabytes(1)); gb_printf("%lu MiB\n", (unsigned long)(info.totalram * info.mem_unit / gb_megabytes(1)));
} else { } else {
gb_printf("Unknown.\n"); gb_printf("Unknown.\n");
} }
+11 -1
View File
@@ -978,7 +978,7 @@ gb_global TargetMetrics target_linux_arm32 = {
TargetOs_linux, TargetOs_linux,
TargetArch_arm32, TargetArch_arm32,
4, 4, 4, 8, 4, 4, 4, 8,
str_lit("arm-linux-gnu"), str_lit("arm-unknown-linux-gnueabihf"),
}; };
gb_global TargetMetrics target_darwin_amd64 = { gb_global TargetMetrics target_darwin_amd64 = {
@@ -1906,6 +1906,16 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
#else #else
metrics = &target_linux_amd64; metrics = &target_linux_amd64;
#endif #endif
#elif defined(GB_CPU_ARM)
#if defined(GB_SYSTEM_WINDOWS)
#error "Build Error: Unsupported architecture"
#elif defined(GB_SYSTEM_OSX)
#error "Build Error: Unsupported architecture"
#elif defined(GB_SYSTEM_FREEBSD)
#error "Build Error: Unsupported architecture"
#else
metrics = &target_linux_arm32;
#endif
#else #else
#if defined(GB_SYSTEM_WINDOWS) #if defined(GB_SYSTEM_WINDOWS)
metrics = &target_windows_i386; metrics = &target_windows_i386;
+4
View File
@@ -2645,6 +2645,10 @@ gb_internal void generate_minimum_dependency_set(Checker *c, Entity *start) {
str_lit("memmove"), str_lit("memmove"),
); );
FORCE_ADD_RUNTIME_ENTITIES(build_context.metrics.arch == TargetArch_arm32,
str_lit("aeabi_d2h")
);
FORCE_ADD_RUNTIME_ENTITIES(is_arch_wasm() && !build_context.tilde_backend, FORCE_ADD_RUNTIME_ENTITIES(is_arch_wasm() && !build_context.tilde_backend,
// // Extended data type internal procedures // // Extended data type internal procedures
// str_lit("umodti3"), // str_lit("umodti3"),
+4 -3
View File
@@ -6261,11 +6261,12 @@ gb_no_inline isize gb_snprintf_va(char *text, isize max_len, char const *fmt, va
#elif defined(__aarch64__) #elif defined(__aarch64__)
gb_inline u64 gb_rdtsc(void) { gb_inline u64 gb_rdtsc(void) {
int64_t virtual_timer_value; int64_t virtual_timer_value;
asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value)); asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value));
return virtual_timer_value; return virtual_timer_value;
} }
#else #else
#error "gb_rdtsc not supported" #warning "gb_rdtsc not supported"
gb_inline u64 gb_rdtsc(void) { return 0; }
#endif #endif
#if defined(GB_SYSTEM_WINDOWS) #if defined(GB_SYSTEM_WINDOWS)
+2 -2
View File
@@ -2904,7 +2904,6 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
break; break;
case TargetArch_arm32: case TargetArch_arm32:
{ {
// TODO(bill): Check this is correct
GB_ASSERT(arg_count <= 7); GB_ASSERT(arg_count <= 7);
char asm_string[] = "svc #0"; char asm_string[] = "svc #0";
@@ -2912,13 +2911,14 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
for (unsigned i = 0; i < arg_count; i++) { for (unsigned i = 0; i < arg_count; i++) {
constraints = gb_string_appendc(constraints, ",{"); constraints = gb_string_appendc(constraints, ",{");
static char const *regs[] = { static char const *regs[] = {
"r8", "r7",
"r0", "r0",
"r1", "r1",
"r2", "r2",
"r3", "r3",
"r4", "r4",
"r5", "r5",
"r6",
}; };
constraints = gb_string_appendc(constraints, regs[i]); constraints = gb_string_appendc(constraints, regs[i]);
constraints = gb_string_appendc(constraints, "}"); constraints = gb_string_appendc(constraints, "}");