From 2b9478ce12a5556a9ef596d98a14347be8daee4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=27vesim=27=20Kuli=C5=84ski?= Date: Fri, 9 Dec 2022 22:18:18 +0100 Subject: [PATCH] Sema: implement AVR address spaces Co-authored-by: Veikka Tuominen --- lib/std/builtin.zig | 8 ++++++++ lib/std/target.zig | 2 ++ src/Sema.zig | 2 ++ src/codegen/llvm.zig | 10 ++++++++++ src/codegen/llvm/bindings.zig | 8 ++++++-- src/codegen/spirv.zig | 2 +- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index c08af8ec44..4d949946d8 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -174,6 +174,14 @@ pub const AddressSpace = enum { param, shared, local, + + // AVR address spaces. + flash, + flash1, + flash2, + flash3, + flash4, + flash5, }; /// This data structure is used by the Zig language code generation and diff --git a/lib/std/target.zig b/lib/std/target.zig index 69acfadd9e..fa4623d248 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -1186,6 +1186,8 @@ pub const Target = struct { .fs, .gs, .ss => arch == .x86_64 or arch == .x86, .global, .constant, .local, .shared => is_gpu, .param => is_nvptx, + // TODO this should also check how many flash banks the cpu has + .flash, .flash1, .flash2, .flash3, .flash4, .flash5 => arch == .avr, }; } diff --git a/src/Sema.zig b/src/Sema.zig index 92024f7178..14e2345034 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -31938,6 +31938,8 @@ pub fn analyzeAddressSpace( .param => is_nv, .global, .shared, .local => is_gpu, .constant => is_gpu and (ctx == .constant), + // TODO this should also check how many flash banks the cpu has + .flash, .flash1, .flash2, .flash3, .flash4, .flash5 => arch == .avr, }; if (!supported) { diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 235949d117..a0db229796 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -10241,6 +10241,16 @@ fn toLlvmAddressSpace(address_space: std.builtin.AddressSpace, target: std.Targe .local => llvm.address_space.amdgpu.private, else => unreachable, }, + .avr => switch (address_space) { + .generic => llvm.address_space.default, + .flash => llvm.address_space.avr.flash, + .flash1 => llvm.address_space.avr.flash1, + .flash2 => llvm.address_space.avr.flash2, + .flash3 => llvm.address_space.avr.flash3, + .flash4 => llvm.address_space.avr.flash4, + .flash5 => llvm.address_space.avr.flash5, + else => unreachable, + }, else => switch (address_space) { .generic => llvm.address_space.default, else => unreachable, diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index c78c951eee..e16da29335 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -1530,8 +1530,12 @@ pub const address_space = struct { // See llvm/lib/Target/AVR/AVR.h pub const avr = struct { - pub const data_memory: c_uint = 0; - pub const program_memory: c_uint = 1; + pub const flash: c_uint = 1; + pub const flash1: c_uint = 2; + pub const flash2: c_uint = 3; + pub const flash3: c_uint = 4; + pub const flash4: c_uint = 5; + pub const flash5: c_uint = 6; }; // See llvm/lib/Target/NVPTX/NVPTX.h diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 4db3b34b1e..e1af8c847f 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -548,7 +548,7 @@ pub const DeclGen = struct { .gs, .fs, .ss => unreachable, .shared => .Workgroup, .local => .Private, - .global, .param, .constant => unreachable, + .global, .param, .constant, .flash, .flash1, .flash2, .flash3, .flash4, .flash5 => unreachable, }; }