authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-11 14:56:59-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-11 14:56:59-05:00
logd9e01be97386f008e4a4b4281658f25b50ff80f1
tree94831133fc8ae5249fe19c18e98ed70577c32d4b
parent4a1b910e03f931b7d8d3cb8c810b084e6e152e18
signature Commit is signed but in an unrecognized format.

translate-c: use C pointer type everywhere

See #1059

6 files changed, 72 insertions(+), 80 deletions(-)

src/analyze.cpp+9
......@@ -6872,3 +6872,12 @@ Error ensure_const_val_repr(IrAnalyze *ira, CodeGen *codegen, AstNode *source_no
68726872
68736873 return ErrorNone;
68746874}
6875
6876const char *container_string(ContainerKind kind) {
6877 switch (kind) {
6878 case ContainerKindEnum: return "enum";
6879 case ContainerKindStruct: return "struct";
6880 case ContainerKindUnion: return "union";
6881 }
6882 zig_unreachable();
6883}
src/analyze.hpp+1
......@@ -215,6 +215,7 @@ void walk_function_params(CodeGen *g, ZigType *fn_type, FnWalk *fn_walk);
215215X64CABIClass type_c_abi_x86_64_class(CodeGen *g, ZigType *ty);
216216bool type_is_c_abi_int(CodeGen *g, ZigType *ty);
217217bool want_first_arg_sret(CodeGen *g, FnTypeId *fn_type_id);
218const char *container_string(ContainerKind kind);
218219
219220uint32_t get_host_int_bytes(CodeGen *g, ZigType *struct_type, TypeStructField *field);
220221
src/ast_render.cpp+14-13
......@@ -136,13 +136,19 @@ static const char *thread_local_string(Token *tok) {
136136 return (tok == nullptr) ? "" : "threadlocal ";
137137}
138138
139const char *container_string(ContainerKind kind) {
140 switch (kind) {
141 case ContainerKindEnum: return "enum";
142 case ContainerKindStruct: return "struct";
143 case ContainerKindUnion: return "union";
139static const char *token_to_ptr_len_str(Token *tok) {
140 assert(tok != nullptr);
141 switch (tok->id) {
142 case TokenIdStar:
143 case TokenIdStarStar:
144 return "*";
145 case TokenIdBracketStarBracket:
146 return "[*]";
147 case TokenIdBracketStarCBracket:
148 return "[*c]";
149 default:
150 zig_unreachable();
144151 }
145 zig_unreachable();
146152}
147153
148154static const char *node_type_str(NodeType node_type) {
......@@ -644,13 +650,8 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
644650 case NodeTypePointerType:
645651 {
646652 if (!grouped) fprintf(ar->f, "(");
647 const char *star = "[*]";
648 if (node->data.pointer_type.star_token != nullptr &&
649 (node->data.pointer_type.star_token->id == TokenIdStar || node->data.pointer_type.star_token->id == TokenIdStarStar))
650 {
651 star = "*";
652 }
653 fprintf(ar->f, "%s", star);
653 const char *ptr_len_str = token_to_ptr_len_str(node->data.pointer_type.star_token);
654 fprintf(ar->f, "%s", ptr_len_str);
654655 if (node->data.pointer_type.align_expr != nullptr) {
655656 fprintf(ar->f, "align(");
656657 render_node_grouped(ar, node->data.pointer_type.align_expr);
src/ast_render.hpp-3
......@@ -17,7 +17,4 @@ void ast_print(FILE *f, AstNode *node, int indent);
1717
1818void ast_render(CodeGen *codegen, FILE *f, AstNode *node, int indent_size);
1919
20const char *container_string(ContainerKind kind);
21
2220#endif
23
src/translate_c.cpp+17-33
......@@ -291,11 +291,22 @@ static AstNode *maybe_suppress_result(Context *c, ResultUsed result_used, AstNod
291291 node);
292292}
293293
294static TokenId ptr_len_to_token_id(PtrLen ptr_len) {
295 switch (ptr_len) {
296 case PtrLenSingle:
297 return TokenIdStar;
298 case PtrLenUnknown:
299 return TokenIdBracketStarBracket;
300 case PtrLenC:
301 return TokenIdBracketStarCBracket;
302 }
303 zig_unreachable();
304}
305
294306static AstNode *trans_create_node_ptr_type(Context *c, bool is_const, bool is_volatile, AstNode *child_node, PtrLen ptr_len) {
295307 AstNode *node = trans_create_node(c, NodeTypePointerType);
296308 node->data.pointer_type.star_token = allocate<ZigToken>(1);
297 node->data.pointer_type.star_token->id = (ptr_len == PtrLenSingle) ? TokenIdStar: TokenIdBracketStarBracket;
298 node->data.pointer_type.is_const = is_const;
309 node->data.pointer_type.star_token->id = ptr_len_to_token_id(ptr_len);
299310 node->data.pointer_type.is_const = is_const;
300311 node->data.pointer_type.is_volatile = is_volatile;
301312 node->data.pointer_type.op_expr = child_node;
......@@ -752,30 +763,6 @@ static bool qual_type_has_wrapping_overflow(Context *c, QualType qt) {
752763 }
753764}
754765
755static bool type_is_opaque(Context *c, const Type *ty, const SourceLocation &source_loc) {
756 switch (ty->getTypeClass()) {
757 case Type::Builtin: {
758 const BuiltinType *builtin_ty = static_cast<const BuiltinType*>(ty);
759 return builtin_ty->getKind() == BuiltinType::Void;
760 }
761 case Type::Record: {
762 const RecordType *record_ty = static_cast<const RecordType*>(ty);
763 return record_ty->getDecl()->getDefinition() == nullptr;
764 }
765 case Type::Elaborated: {
766 const ElaboratedType *elaborated_ty = static_cast<const ElaboratedType*>(ty);
767 return type_is_opaque(c, elaborated_ty->getNamedType().getTypePtr(), source_loc);
768 }
769 case Type::Typedef: {
770 const TypedefType *typedef_ty = static_cast<const TypedefType*>(ty);
771 const TypedefNameDecl *typedef_decl = typedef_ty->getDecl();
772 return type_is_opaque(c, typedef_decl->getUnderlyingType().getTypePtr(), source_loc);
773 }
774 default:
775 return false;
776 }
777}
778
779766static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &source_loc) {
780767 switch (ty->getTypeClass()) {
781768 case Type::Builtin:
......@@ -925,11 +912,8 @@ static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &sou
925912 return trans_create_node_prefix_op(c, PrefixOpOptional, child_node);
926913 }
927914
928 PtrLen ptr_len = type_is_opaque(c, child_qt.getTypePtr(), source_loc) ? PtrLenSingle : PtrLenUnknown;
929
930 AstNode *pointer_node = trans_create_node_ptr_type(c, child_qt.isConstQualified(),
931 child_qt.isVolatileQualified(), child_node, ptr_len);
932 return trans_create_node_prefix_op(c, PrefixOpOptional, pointer_node);
915 return trans_create_node_ptr_type(c, child_qt.isConstQualified(),
916 child_qt.isVolatileQualified(), child_node, PtrLenC);
933917 }
934918 case Type::Typedef:
935919 {
......@@ -1113,7 +1097,7 @@ static AstNode *trans_type(Context *c, const Type *ty, const SourceLocation &sou
11131097 return nullptr;
11141098 }
11151099 AstNode *pointer_node = trans_create_node_ptr_type(c, child_qt.isConstQualified(),
1116 child_qt.isVolatileQualified(), child_type_node, PtrLenUnknown);
1100 child_qt.isVolatileQualified(), child_type_node, PtrLenC);
11171101 return pointer_node;
11181102 }
11191103 case Type::BlockPointer:
......@@ -4568,7 +4552,7 @@ static AstNode *parse_ctok_suffix_op_expr(Context *c, CTokenize *ctok, size_t *t
45684552 } else if (first_tok->id == CTokIdAsterisk) {
45694553 *tok_i += 1;
45704554
4571 node = trans_create_node_ptr_type(c, false, false, node, PtrLenUnknown);
4555 node = trans_create_node_ptr_type(c, false, false, node, PtrLenC);
45724556 } else {
45734557 return node;
45744558 }
test/translate_c.zig+31-31
......@@ -117,11 +117,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
117117 \\};
118118 ,
119119 \\pub const struct_Foo = extern struct {
120 \\ a: ?[*]Foo,
120 \\ a: [*c]Foo,
121121 \\};
122122 \\pub const Foo = struct_Foo;
123123 \\pub const struct_Bar = extern struct {
124 \\ a: ?[*]Foo,
124 \\ a: [*c]Foo,
125125 \\};
126126 );
127127
......@@ -202,7 +202,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
202202 cases.add("restrict -> noalias",
203203 \\void foo(void *restrict bar, void *restrict);
204204 ,
205 \\pub extern fn foo(noalias bar: ?*c_void, noalias arg1: ?*c_void) void;
205 \\pub extern fn foo(noalias bar: [*c]c_void, noalias arg1: [*c]c_void) void;
206206 );
207207
208208 cases.add("simple struct",
......@@ -213,7 +213,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
213213 ,
214214 \\const struct_Foo = extern struct {
215215 \\ x: c_int,
216 \\ y: ?[*]u8,
216 \\ y: [*c]u8,
217217 \\};
218218 ,
219219 \\pub const Foo = struct_Foo;
......@@ -244,7 +244,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
244244 ,
245245 \\pub const BarB = enum_Bar.B;
246246 ,
247 \\pub extern fn func(a: ?[*]struct_Foo, b: ?[*](?[*]enum_Bar)) void;
247 \\pub extern fn func(a: [*c]struct_Foo, b: [*c]([*c]enum_Bar)) void;
248248 ,
249249 \\pub const Foo = struct_Foo;
250250 ,
......@@ -254,7 +254,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
254254 cases.add("constant size array",
255255 \\void func(int array[20]);
256256 ,
257 \\pub extern fn func(array: ?[*]c_int) void;
257 \\pub extern fn func(array: [*c]c_int) void;
258258 );
259259
260260 cases.add("self referential struct with function pointer",
......@@ -263,7 +263,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
263263 \\};
264264 ,
265265 \\pub const struct_Foo = extern struct {
266 \\ derp: ?extern fn(?[*]struct_Foo) void,
266 \\ derp: ?extern fn([*c]struct_Foo) void,
267267 \\};
268268 ,
269269 \\pub const Foo = struct_Foo;
......@@ -275,7 +275,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
275275 ,
276276 \\pub const struct_Foo = @OpaqueType();
277277 ,
278 \\pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
278 \\pub extern fn some_func(foo: [*c]struct_Foo, x: c_int) [*c]struct_Foo;
279279 ,
280280 \\pub const Foo = struct_Foo;
281281 );
......@@ -322,11 +322,11 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
322322 \\};
323323 ,
324324 \\pub const struct_Bar = extern struct {
325 \\ next: ?[*]struct_Foo,
325 \\ next: [*c]struct_Foo,
326326 \\};
327327 ,
328328 \\pub const struct_Foo = extern struct {
329 \\ next: ?[*]struct_Bar,
329 \\ next: [*c]struct_Bar,
330330 \\};
331331 );
332332
......@@ -336,7 +336,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
336336 ,
337337 \\pub const Foo = c_void;
338338 ,
339 \\pub extern fn fun(a: ?*Foo) Foo;
339 \\pub extern fn fun(a: [*c]Foo) Foo;
340340 );
341341
342342 cases.add("generate inline func for #define global extern fn",
......@@ -608,7 +608,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
608608 \\ return 6;
609609 \\}
610610 ,
611 \\pub export fn and_or_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
611 \\pub export fn and_or_none_bool(a: c_int, b: f32, c: [*c]c_void) c_int {
612612 \\ if ((a != 0) and (b != 0)) return 0;
613613 \\ if ((b != 0) and (c != null)) return 1;
614614 \\ if ((a != 0) and (c != null)) return 2;
......@@ -710,7 +710,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
710710 \\pub const struct_Foo = extern struct {
711711 \\ field: c_int,
712712 \\};
713 \\pub export fn read_field(foo: ?[*]struct_Foo) c_int {
713 \\pub export fn read_field(foo: [*c]struct_Foo) c_int {
714714 \\ return foo.?.field;
715715 \\}
716716 );
......@@ -756,8 +756,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
756756 \\ return x;
757757 \\}
758758 ,
759 \\pub export fn foo(x: ?[*]c_ushort) ?*c_void {
760 \\ return @ptrCast(?*c_void, x);
759 \\pub export fn foo(x: [*c]c_ushort) [*c]c_void {
760 \\ return @ptrCast([*c]c_void, x);
761761 \\}
762762 );
763763
......@@ -777,7 +777,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
777777 \\ return 0;
778778 \\}
779779 ,
780 \\pub export fn foo() ?[*]c_int {
780 \\pub export fn foo() [*c]c_int {
781781 \\ return null;
782782 \\}
783783 );
......@@ -1086,7 +1086,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
10861086 \\ *x = 1;
10871087 \\}
10881088 ,
1089 \\pub export fn foo(x: ?[*]c_int) void {
1089 \\pub export fn foo(x: [*c]c_int) void {
10901090 \\ x.?.* = 1;
10911091 \\}
10921092 );
......@@ -1114,7 +1114,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11141114 ,
11151115 \\pub fn foo() c_int {
11161116 \\ var x: c_int = 1234;
1117 \\ var ptr: ?[*]c_int = &x;
1117 \\ var ptr: [*c]c_int = &x;
11181118 \\ return ptr.?.*;
11191119 \\}
11201120 );
......@@ -1124,7 +1124,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
11241124 \\ return "bar";
11251125 \\}
11261126 ,
1127 \\pub fn foo() ?[*]const u8 {
1127 \\pub fn foo() [*c]const u8 {
11281128 \\ return c"bar";
11291129 \\}
11301130 );
......@@ -1253,8 +1253,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
12531253 \\ return (float *)a;
12541254 \\}
12551255 ,
1256 \\fn ptrcast(a: ?[*]c_int) ?[*]f32 {
1257 \\ return @ptrCast(?[*]f32, a);
1256 \\fn ptrcast(a: [*c]c_int) [*c]f32 {
1257 \\ return @ptrCast([*c]f32, a);
12581258 \\}
12591259 );
12601260
......@@ -1276,7 +1276,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
12761276 \\ return !c;
12771277 \\}
12781278 ,
1279 \\pub fn foo(a: c_int, b: f32, c: ?*c_void) c_int {
1279 \\pub fn foo(a: c_int, b: f32, c: [*c]c_void) c_int {
12801280 \\ return !(a == 0);
12811281 \\ return !(a != 0);
12821282 \\ return !(b != 0);
......@@ -1297,7 +1297,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
12971297 cases.add("const ptr initializer",
12981298 \\static const char *v0 = "0.0.0";
12991299 ,
1300 \\pub var v0: ?[*]const u8 = c"0.0.0";
1300 \\pub var v0: [*c]const u8 = c"0.0.0";
13011301 );
13021302
13031303 cases.add("static incomplete array inside function",
......@@ -1306,17 +1306,17 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13061306 \\}
13071307 ,
13081308 \\pub fn foo() void {
1309 \\ const v2: [*]const u8 = c"2.2.2";
1309 \\ const v2: [*c]const u8 = c"2.2.2";
13101310 \\}
13111311 );
13121312
13131313 cases.add("macro pointer cast",
13141314 \\#define NRF_GPIO ((NRF_GPIO_Type *) NRF_GPIO_BASE)
13151315 ,
1316 \\pub const NRF_GPIO = if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Pointer) @ptrCast([*]NRF_GPIO_Type, NRF_GPIO_BASE) else if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Int) @intToPtr([*]NRF_GPIO_Type, NRF_GPIO_BASE) else ([*]NRF_GPIO_Type)(NRF_GPIO_BASE);
1316 \\pub const NRF_GPIO = if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Pointer) @ptrCast([*c]NRF_GPIO_Type, NRF_GPIO_BASE) else if (@typeId(@typeOf(NRF_GPIO_BASE)) == @import("builtin").TypeId.Int) @intToPtr([*c]NRF_GPIO_Type, NRF_GPIO_BASE) else ([*c]NRF_GPIO_Type)(NRF_GPIO_BASE);
13171317 );
13181318
1319 cases.add("if on none bool",
1319 cases.add("if on non-bool",
13201320 \\enum SomeEnum { A, B, C };
13211321 \\int if_none_bool(int a, float b, void *c, enum SomeEnum d) {
13221322 \\ if (a) return 0;
......@@ -1334,7 +1334,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13341334 \\ B,
13351335 \\ C,
13361336 \\};
1337 \\pub fn if_none_bool(a: c_int, b: f32, c: ?*c_void, d: enum_SomeEnum) c_int {
1337 \\pub fn if_none_bool(a: c_int, b: f32, c: [*c]c_void, d: enum_SomeEnum) c_int {
13381338 \\ if (a != 0) return 0;
13391339 \\ if (b != 0) return 1;
13401340 \\ if (c != null) return 2;
......@@ -1343,7 +1343,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13431343 \\}
13441344 );
13451345
1346 cases.add("while on none bool",
1346 cases.add("while on non-bool",
13471347 \\int while_none_bool(int a, float b, void *c) {
13481348 \\ while (a) return 0;
13491349 \\ while (b) return 1;
......@@ -1351,7 +1351,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13511351 \\ return 3;
13521352 \\}
13531353 ,
1354 \\pub fn while_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
1354 \\pub fn while_none_bool(a: c_int, b: f32, c: [*c]c_void) c_int {
13551355 \\ while (a != 0) return 0;
13561356 \\ while (b != 0) return 1;
13571357 \\ while (c != null) return 2;
......@@ -1359,7 +1359,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13591359 \\}
13601360 );
13611361
1362 cases.add("for on none bool",
1362 cases.add("for on non-bool",
13631363 \\int for_none_bool(int a, float b, void *c) {
13641364 \\ for (;a;) return 0;
13651365 \\ for (;b;) return 1;
......@@ -1367,7 +1367,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
13671367 \\ return 3;
13681368 \\}
13691369 ,
1370 \\pub fn for_none_bool(a: c_int, b: f32, c: ?*c_void) c_int {
1370 \\pub fn for_none_bool(a: c_int, b: f32, c: [*c]c_void) c_int {
13711371 \\ while (a != 0) return 0;
13721372 \\ while (b != 0) return 1;
13731373 \\ while (c != null) return 2;