Sema: implement AVR address spaces

Co-authored-by: Veikka Tuominen <git@vexu.eu>
This commit is contained in:
Maciej 'vesim' Kuliński 2022-12-09 22:18:18 +01:00 committed by Veikka Tuominen
parent fd0fb26aba
commit 2b9478ce12
6 changed files with 29 additions and 3 deletions

View File

@ -174,6 +174,14 @@ pub const AddressSpace = enum {
param, param,
shared, shared,
local, local,
// AVR address spaces.
flash,
flash1,
flash2,
flash3,
flash4,
flash5,
}; };
/// This data structure is used by the Zig language code generation and /// This data structure is used by the Zig language code generation and

View File

@ -1186,6 +1186,8 @@ pub const Target = struct {
.fs, .gs, .ss => arch == .x86_64 or arch == .x86, .fs, .gs, .ss => arch == .x86_64 or arch == .x86,
.global, .constant, .local, .shared => is_gpu, .global, .constant, .local, .shared => is_gpu,
.param => is_nvptx, .param => is_nvptx,
// TODO this should also check how many flash banks the cpu has
.flash, .flash1, .flash2, .flash3, .flash4, .flash5 => arch == .avr,
}; };
} }

View File

@ -31938,6 +31938,8 @@ pub fn analyzeAddressSpace(
.param => is_nv, .param => is_nv,
.global, .shared, .local => is_gpu, .global, .shared, .local => is_gpu,
.constant => is_gpu and (ctx == .constant), .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) { if (!supported) {

View File

@ -10241,6 +10241,16 @@ fn toLlvmAddressSpace(address_space: std.builtin.AddressSpace, target: std.Targe
.local => llvm.address_space.amdgpu.private, .local => llvm.address_space.amdgpu.private,
else => unreachable, 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) { else => switch (address_space) {
.generic => llvm.address_space.default, .generic => llvm.address_space.default,
else => unreachable, else => unreachable,

View File

@ -1530,8 +1530,12 @@ pub const address_space = struct {
// See llvm/lib/Target/AVR/AVR.h // See llvm/lib/Target/AVR/AVR.h
pub const avr = struct { pub const avr = struct {
pub const data_memory: c_uint = 0; pub const flash: c_uint = 1;
pub const program_memory: 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 // See llvm/lib/Target/NVPTX/NVPTX.h

View File

@ -548,7 +548,7 @@ pub const DeclGen = struct {
.gs, .fs, .ss => unreachable, .gs, .fs, .ss => unreachable,
.shared => .Workgroup, .shared => .Workgroup,
.local => .Private, .local => .Private,
.global, .param, .constant => unreachable, .global, .param, .constant, .flash, .flash1, .flash2, .flash3, .flash4, .flash5 => unreachable,
}; };
} }