Skip to content

Commit 8ef7887

Browse files
committed
translate-c: annotate volatile-qualified non-pointer typedefs
1 parent c9d6470 commit 8ef7887

File tree

2 files changed

+47
-18
lines changed

2 files changed

+47
-18
lines changed

src/translate_c.zig

+15-1
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,16 @@ fn declVisitorNamesOnly(c: *Context, decl: *const clang.Decl) Error!void {
265265
c.weak_global_names.putAssumeCapacity(decl_name, {});
266266
c.weak_global_names.putAssumeCapacity(prefixed_name, {});
267267
},
268+
.Typedef => {
269+
const typedef_decl = @as(*const clang.TypedefNameDecl, @ptrCast(decl));
270+
const child_qt = typedef_decl.getUnderlyingType();
271+
if (child_qt.isVolatileQualified()) {
272+
const prefixed_name = try std.fmt.allocPrint(c.arena, "volatile_{s}", .{decl_name});
273+
try c.weak_global_names.put(c.gpa, prefixed_name, {});
274+
} else {
275+
try c.global_names.put(c.gpa, decl_name, {});
276+
}
277+
},
268278
else => {
269279
try c.global_names.put(c.gpa, decl_name, {});
270280
},
@@ -697,10 +707,14 @@ fn transTypeDef(c: *Context, scope: *Scope, typedef_decl: *const clang.TypedefNa
697707
if (builtin_typedef_map.get(name)) |builtin| {
698708
return c.decl_table.putNoClobber(c.gpa, @intFromPtr(typedef_decl.getCanonicalDecl()), builtin);
699709
}
710+
const child_qt = typedef_decl.getUnderlyingType();
711+
if (child_qt.isVolatileQualified()) {
712+
name = try std.fmt.allocPrint(c.arena, "volatile_{s}", .{name});
713+
if (toplevel) name = try mangleWeakGlobalName(c, name);
714+
}
700715
if (!toplevel) name = try bs.makeMangledName(c, name);
701716
try c.decl_table.putNoClobber(c.gpa, @intFromPtr(typedef_decl.getCanonicalDecl()), name);
702717

703-
const child_qt = typedef_decl.getUnderlyingType();
704718
const typedef_loc = typedef_decl.getLocation();
705719
const init_node = transQualType(c, scope, child_qt, typedef_loc) catch |err| switch (err) {
706720
error.UnsupportedType => {

test/cases/translate_c/volatile_typedef.c

+32-17
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ extern hw_t hw_arr[4];
1515
extern const mmio_int reg;
1616
extern mmio_int *regs;
1717

18+
// Check name mangling
19+
typedef volatile unsigned int mmio_uint;
20+
typedef unsigned int volatile_mmio_uint;
21+
static unsigned int check_typenames(void) {
22+
const mmio_uint x = 0u;
23+
return (volatile_mmio_uint)x;
24+
}
25+
1826
static int hw_reg(void) {
1927
return hw->reg;
2028
}
@@ -54,42 +62,49 @@ static int ptr_arith(void) {
5462
// translate-c
5563
// c_frontend=clang
5664
//
57-
// pub const mmio_int = c_int;
58-
// pub const mmio_int_ptr = [*c]volatile mmio_int;
65+
// pub const volatile_mmio_int = c_int;
66+
// pub const mmio_int_ptr = [*c]volatile volatile_mmio_int;
5967
// pub const hw_t = extern struct {
60-
// reg: mmio_int = @import("std").mem.zeroes(mmio_int),
61-
// regs: [4]mmio_int = @import("std").mem.zeroes([4]mmio_int),
62-
// regm: [2][2]mmio_int = @import("std").mem.zeroes([2][2]mmio_int),
68+
// reg: volatile_mmio_int = @import("std").mem.zeroes(volatile_mmio_int),
69+
// regs: [4]volatile_mmio_int = @import("std").mem.zeroes([4]volatile_mmio_int),
70+
// regm: [2][2]volatile_mmio_int = @import("std").mem.zeroes([2][2]volatile_mmio_int),
6371
// ptr: mmio_int_ptr = @import("std").mem.zeroes(mmio_int_ptr),
6472
// };
6573
// pub extern var hw: [*c]hw_t;
6674
// pub extern var hw_arr: [4]hw_t;
67-
// pub extern const reg: mmio_int;
68-
// pub extern var regs: [*c]volatile mmio_int;
75+
// pub extern const reg: volatile_mmio_int;
76+
// pub extern var regs: [*c]volatile volatile_mmio_int;
77+
// pub const volatile_mmio_uint_1 = c_uint;
78+
// pub const volatile_mmio_uint = c_uint;
79+
// pub fn check_typenames() callconv(.c) c_uint {
80+
// const x: volatile_mmio_uint_1 = 0;
81+
// _ = &x;
82+
// return @as(volatile_mmio_uint, @bitCast(x));
83+
// }
6984
// pub fn hw_reg() callconv(.c) c_int {
70-
// return @as([*c]volatile mmio_int, @ptrCast(&hw.*.reg)).*;
85+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(&hw.*.reg)).*;
7186
// }
72-
// pub fn hw_reg_ptr() callconv(.c) @TypeOf(@as([*c]volatile mmio_int, @ptrCast(&@as([*c]volatile mmio_int, @ptrCast(&hw.*.reg)).*))) {
73-
// return @as([*c]volatile mmio_int, @ptrCast(&@as([*c]volatile mmio_int, @ptrCast(&hw.*.reg)).*));
87+
// pub fn hw_reg_ptr() callconv(.c) @TypeOf(@as([*c]volatile volatile_mmio_int, @ptrCast(&@as([*c]volatile volatile_mmio_int, @ptrCast(&hw.*.reg)).*))) {
88+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(&@as([*c]volatile volatile_mmio_int, @ptrCast(&hw.*.reg)).*));
7489
// }
7590
// pub fn hw_ptr() callconv(.c) mmio_int_ptr {
7691
// return hw.*.ptr;
7792
// }
78-
// pub fn reg_ptr() callconv(.c) @TypeOf(@as([*c]const volatile mmio_int, @ptrCast(&reg))) {
79-
// return @as([*c]const volatile mmio_int, @ptrCast(&reg));
93+
// pub fn reg_ptr() callconv(.c) @TypeOf(@as([*c]const volatile volatile_mmio_int, @ptrCast(&reg))) {
94+
// return @as([*c]const volatile volatile_mmio_int, @ptrCast(&reg));
8095
// }
8196
// pub fn hw_regs_0() callconv(.c) c_int {
82-
// return @as([*c]volatile mmio_int, @ptrCast(&hw.*.regs[@as(c_uint, 0)])).*;
97+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(&hw.*.regs[@as(c_uint, 0)])).*;
8398
// }
8499
// pub fn hw_0_regs_0() callconv(.c) c_int {
85-
// return @as([*c]volatile mmio_int, @ptrCast(&hw_arr[@as(c_uint, 0)].regs[@as(c_uint, 0)])).*;
100+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(&hw_arr[@as(c_uint, 0)].regs[@as(c_uint, 0)])).*;
86101
// }
87102
// pub fn hw_regm_00() callconv(.c) c_int {
88-
// return @as([*c]volatile mmio_int, @ptrCast(&hw.*.regm[@as(c_uint, 0)][@as(c_uint, 0)])).*;
103+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(&hw.*.regm[@as(c_uint, 0)][@as(c_uint, 0)])).*;
89104
// }
90105
// pub fn hw_regm_0_deref() callconv(.c) c_int {
91-
// return @as([*c]volatile mmio_int, @ptrCast(@as([*c]volatile mmio_int, @ptrCast(@alignCast(&hw.*.regm[@as(c_uint, 0)]))))).*;
106+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(@as([*c]volatile volatile_mmio_int, @ptrCast(@alignCast(&hw.*.regm[@as(c_uint, 0)]))))).*;
92107
// }
93108
// pub fn ptr_arith() callconv(.c) c_int {
94-
// return @as([*c]volatile mmio_int, @ptrCast(regs + @as(c_uint, 1))).*;
109+
// return @as([*c]volatile volatile_mmio_int, @ptrCast(regs + @as(c_uint, 1))).*;
95110
// }

0 commit comments

Comments
 (0)