authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-12-27 19:26:39+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-02 18:53:21+01:00
log0ec64d4c0c610face291f41db4215ea2bcd48d50
tree486656a0cc774ebba121cf354c0337976e8b3edf
parent271fc6a2479a1c5f2f914c1c40a848bf1b9d70d8

Integrate callconv into translate-c-2


2 files changed, 20 insertions(+), 9 deletions(-)

lib/std/zig/render.zig+6-6
...@@ -1377,14 +1377,14 @@ fn renderExpression(...@@ -1377,14 +1377,14 @@ fn renderExpression(
1377 }1377 }
13781378
1379 if (fn_proto.callconv_expr) |callconv_expr| {1379 if (fn_proto.callconv_expr) |callconv_expr| {
1380 const section_rparen = tree.nextToken(callconv_expr.lastToken());1380 const callconv_rparen = tree.nextToken(callconv_expr.lastToken());
1381 const section_lparen = tree.prevToken(callconv_expr.firstToken());1381 const callconv_lparen = tree.prevToken(callconv_expr.firstToken());
1382 const section_kw = tree.prevToken(section_lparen);1382 const callconv_kw = tree.prevToken(callconv_lparen);
13831383
1384 try renderToken(tree, stream, section_kw, indent, start_col, Space.None); // section1384 try renderToken(tree, stream, callconv_kw, indent, start_col, Space.None); // section
1385 try renderToken(tree, stream, section_lparen, indent, start_col, Space.None); // (1385 try renderToken(tree, stream, callconv_lparen, indent, start_col, Space.None); // (
1386 try renderExpression(allocator, stream, tree, indent, start_col, callconv_expr, Space.None);1386 try renderExpression(allocator, stream, tree, indent, start_col, callconv_expr, Space.None);
1387 try renderToken(tree, stream, section_rparen, indent, start_col, Space.Space); // )1387 try renderToken(tree, stream, callconv_rparen, indent, start_col, Space.Space); // )
1388 } else if (cc_rewrite_str) |str| {1388 } else if (cc_rewrite_str) |str| {
1389 try stream.write("callconv(");1389 try stream.write("callconv(");
1390 try stream.write(mem.toSliceConst(u8, str));1390 try stream.write(mem.toSliceConst(u8, str));
src-self-hosted/translate_c.zig+14-3
...@@ -3973,6 +3973,10 @@ fn transCC(...@@ -3973,6 +3973,10 @@ fn transCC(
3973 switch (clang_cc) {3973 switch (clang_cc) {
3974 .C => return CallingConvention.C,3974 .C => return CallingConvention.C,
3975 .X86StdCall => return CallingConvention.Stdcall,3975 .X86StdCall => return CallingConvention.Stdcall,
3976 .X86FastCall => return CallingConvention.Fastcall,
3977 .X86VectorCall, .AArch64VectorCall => return CallingConvention.Vectorcall,
3978 .AAPCS => return CallingConvention.AAPCS,
3979 .AAPCS_VFP => return CallingConvention.AAPCSVFP,
3976 else => return revertAndWarn(3980 else => return revertAndWarn(
3977 rp,3981 rp,
3978 error.UnsupportedType,3982 error.UnsupportedType,
...@@ -4028,7 +4032,6 @@ fn finishTransFnProto(...@@ -4028,7 +4032,6 @@ fn finishTransFnProto(
40284032
4029 // pub extern fn name(...) T4033 // pub extern fn name(...) T
4030 const pub_tok = if (is_pub) try appendToken(rp.c, .Keyword_pub, "pub") else null;4034 const pub_tok = if (is_pub) try appendToken(rp.c, .Keyword_pub, "pub") else null;
4031 const cc_tok = if (cc == .Stdcall) try appendToken(rp.c, .Keyword_stdcallcc, "stdcallcc") else null;
4032 const extern_export_inline_tok = if (is_export)4035 const extern_export_inline_tok = if (is_export)
4033 try appendToken(rp.c, .Keyword_export, "export")4036 try appendToken(rp.c, .Keyword_export, "export")
4034 else if (cc == .C and is_extern)4037 else if (cc == .C and is_extern)
...@@ -4101,6 +4104,14 @@ fn finishTransFnProto(...@@ -4101,6 +4104,14 @@ fn finishTransFnProto(
41014104
4102 const rparen_tok = try appendToken(rp.c, .RParen, ")");4105 const rparen_tok = try appendToken(rp.c, .RParen, ")");
41034106
4107 const callconv_expr = if (cc == .C and is_extern) null else blk: {
4108 _ = try appendToken(rp.c, .Keyword_callconv, "callconv");
4109 _ = try appendToken(rp.c, .LParen, "(");
4110 const expr = try transCreateNodeEnumLiteral(rp.c, @tagName(cc));
4111 _ = try appendToken(rp.c, .RParen, ")");
4112 break :blk expr;
4113 };
4114
4104 const return_type_node = blk: {4115 const return_type_node = blk: {
4105 if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) {4116 if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) {
4106 break :blk try transCreateNodeIdentifier(rp.c, "noreturn");4117 break :blk try transCreateNodeIdentifier(rp.c, "noreturn");
...@@ -4131,12 +4142,12 @@ fn finishTransFnProto(...@@ -4131,12 +4142,12 @@ fn finishTransFnProto(
4131 .return_type = .{ .Explicit = return_type_node },4142 .return_type = .{ .Explicit = return_type_node },
4132 .var_args_token = null, // TODO this field is broken in the AST data model4143 .var_args_token = null, // TODO this field is broken in the AST data model
4133 .extern_export_inline_token = extern_export_inline_tok,4144 .extern_export_inline_token = extern_export_inline_tok,
4134 .cc_token = cc_tok,4145 .cc_token = null,
4135 .body_node = null,4146 .body_node = null,
4136 .lib_name = null,4147 .lib_name = null,
4137 .align_expr = null,4148 .align_expr = null,
4138 .section_expr = null,4149 .section_expr = null,
4139 .callconv_expr = null,4150 .callconv_expr = callconv_expr,
4140 };4151 };
4141 return fn_proto;4152 return fn_proto;
4142}4153}