Commit 91e416bbf0

Timon Kruiper <timonkruiper@gmail.com>
2021-04-08 14:22:56
stage2: add a simplified export builtin call
std.builtin.ExportOptions is not yet supported, thus the second argument of export is now a simple string that specifies the exported symbol name.
1 parent 272fe0c
Changed files (3)
src/AstGen.zig
@@ -1336,6 +1336,7 @@ fn blockExprStmts(
                         .dbg_stmt_node,
                         .ensure_result_used,
                         .ensure_result_non_error,
+                        .@"export",
                         .set_eval_branch_quota,
                         .compile_log,
                         .ensure_err_payload_void,
@@ -4146,6 +4147,18 @@ fn builtinCall(
             return rvalue(gz, scope, rl, result, node);
         },
 
+        .@"export" => {
+            const target_fn = try expr(gz, scope, .none, params[0]);
+            // FIXME: When structs work in stage2, actually implement this correctly!
+            //        Currently the name is always signifies Strong linkage.
+            const export_name = try comptimeExpr(gz, scope, .{ .ty = .const_slice_u8_type }, params[1]);
+            _ = try gz.addPlNode(.@"export", node, zir.Inst.Bin{
+                .lhs = target_fn,
+                .rhs = export_name,
+            });
+            return rvalue(gz, scope, rl, .void_value, node);
+        },
+
         .add_with_overflow,
         .align_cast,
         .align_of,
@@ -4175,7 +4188,6 @@ fn builtinCall(
         .error_name,
         .error_return_trace,
         .err_set_cast,
-        .@"export",
         .fence,
         .field_parent_ptr,
         .float_to_int,
src/Sema.zig
@@ -342,6 +342,10 @@ pub fn analyzeBody(
                 try sema.zirValidateStructInitPtr(block, inst);
                 continue;
             },
+            .@"export" => {
+                try sema.zirExport(block, inst);
+                continue;
+            },
 
             // Special case instructions to handle comptime control flow.
             .repeat_inline => {
@@ -1333,6 +1337,31 @@ fn analyzeBlockBody(
     return &merges.block_inst.base;
 }
 
+fn zirExport(sema: *Sema, block: *Scope.Block, inst: zir.Inst.Index) InnerError!void {
+    const tracy = trace(@src());
+    defer tracy.end();
+
+    const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
+    const extra = sema.code.extraData(zir.Inst.Bin, inst_data.payload_index).data;
+    const src = inst_data.src();
+
+    const target_fn = try sema.resolveInst(extra.lhs);
+    const target_fn_val = try sema.resolveConstValue(
+        block,
+        .{ .node_offset_builtin_call_arg0 = inst_data.src_node },
+        target_fn,
+    );
+
+    const export_name = try sema.resolveConstString(
+        block,
+        .{ .node_offset_builtin_call_arg1 = inst_data.src_node },
+        extra.rhs,
+    );
+
+    const actual_fn = target_fn_val.castTag(.function).?.data;
+    try sema.mod.analyzeExport(&block.base, src, export_name, actual_fn.owner_decl);
+}
+
 fn zirBreakpoint(sema: *Sema, block: *Scope.Block, inst: zir.Inst.Index) InnerError!void {
     const tracy = trace(@src());
     defer tracy.end();
src/zir.zig
@@ -328,6 +328,10 @@ pub const Inst = struct {
         error_union_type,
         /// `error.Foo` syntax. Uses the `str_tok` field of the Data union.
         error_value,
+        /// Exports a function with a specified name. This can be used at comptime
+        /// to export a function conditionally.
+        /// Uses the `pl_node` union field. Payload is `Bin`.
+        @"export",
         /// Given a pointer to a struct or object that contains virtual fields, returns a pointer
         /// to the named field. The field name is stored in string_bytes. Used by a.b syntax.
         /// Uses `pl_node` field. The AST node is the a.b syntax. Payload is Field.
@@ -737,6 +741,7 @@ pub const Inst = struct {
                 .elem_val_node,
                 .ensure_result_used,
                 .ensure_result_non_error,
+                .@"export",
                 .floatcast,
                 .field_ptr,
                 .field_val,
@@ -1682,6 +1687,7 @@ const Writer = struct {
             .xor,
             .store_node,
             .error_union_type,
+            .@"export",
             .merge_error_sets,
             .bit_and,
             .bit_or,