Commit f13db1ce18

Vallahor <vallahor91@gmail.com>
2022-06-04 01:11:18
autodoc: add cmpxchg_strong/weak
1 parent 4530b44
Changed files (2)
lib
docs
src
lib/docs/main.js
@@ -1113,6 +1113,44 @@ var zigAnalysis;
             const sliceIndex = zigAnalysis.exprs[expr.sliceIndex];
             return exprName(sliceIndex, opts);
           }
+          case "cmpxchg":{
+            console.log(expr);
+            const typeIndex = zigAnalysis.exprs[expr.cmpxchg.type];
+            const ptrIndex = zigAnalysis.exprs[expr.cmpxchg.ptr];
+            const expectedValueIndex = zigAnalysis.exprs[expr.cmpxchg.expected_value];
+            const newValueIndex = zigAnalysis.exprs[expr.cmpxchg.new_value];
+            const successOrderIndex = zigAnalysis.exprs[expr.cmpxchg.success_order];
+            const failureOrderIndex = zigAnalysis.exprs[expr.cmpxchg.failure_order];
+
+            const type = exprName(typeIndex, opts);
+            const ptr = exprName(ptrIndex, opts);
+            const expectedValue = exprName(expectedValueIndex, opts);
+            const newValue = exprName(newValueIndex, opts);
+            const successOrder = exprName(successOrderIndex, opts);
+            const failureOrder = exprName(failureOrderIndex, opts);
+
+            let fnName = "@";
+
+            switch (expr.cmpxchg.name) {
+              case "cmpxchg_strong": {
+                fnName += "cmpxchgStrong"
+                break;
+              }
+              case "cmpxchg_weak": {
+                fnName += "cmpxchgWeak"
+                break;
+              }
+              default: {
+                console.log("There's only cmpxchg_strong and cmpxchg_weak");
+              }
+            }
+            
+            return fnName + "(" + type + ", " + ptr + ", " + expectedValue + ", "+  newValue + ", "+"." +successOrder + ", "+ "." +failureOrder + ")";
+          }
+          case "cmpxchgIndex": {
+            const cmpxchgIndex = zigAnalysis.exprs[expr.cmpxchgIndex];
+            return exprName(cmpxchgIndex, opts);
+          }
           case "switchOp":{
             let condExpr = zigAnalysis.exprs[expr.switchOp.cond_index];
             let node_name_ = expr.switchOp.node_name;
src/Autodoc.zig
@@ -675,6 +675,8 @@ const DocData = struct {
         string: []const u8, // direct value
         sliceIndex: usize,
         slice: Slice,
+        cmpxchgIndex: usize,
+        cmpxchg: Cmpxchg,
         builtin: Builtin,
         builtinIndex: usize,
         builtinBin: BuiltinBin,
@@ -709,6 +711,7 @@ const DocData = struct {
             end: ?usize = null,
             sentinel: ?usize = null, // index in `exprs`
         };
+        const Cmpxchg = struct { name: []const u8, type: usize, ptr: usize, expected_value: usize, new_value: usize, success_order: usize, failure_order: usize };
         const As = struct {
             typeRefArg: ?usize, // index in `exprs`
             exprArg: usize, // index in `exprs`
@@ -814,6 +817,16 @@ const DocData = struct {
                     options,
                     w,
                 ),
+                .cmpxchg => |v| try std.json.stringify(
+                    struct { cmpxchg: Cmpxchg }{ .cmpxchg = v },
+                    options,
+                    w,
+                ),
+                .cmpxchgIndex => |v| try std.json.stringify(
+                    struct { cmpxchgIndex: usize }{ .cmpxchgIndex = v },
+                    options,
+                    w,
+                ),
                 .binOp => |v| try std.json.stringify(
                     struct { binOp: BinOp }{ .binOp = v },
                     options,
@@ -990,6 +1003,67 @@ fn walkInstruction(
                 need_type,
             );
         },
+        .cmpxchg_strong, .cmpxchg_weak => {
+            const pl_node = data[inst_index].pl_node;
+            const extra = file.zir.extraData(Zir.Inst.Cmpxchg, pl_node.payload_index);
+
+            const last_type_index = self.exprs.items.len;
+            const last_type = self.exprs.items[last_type_index - 1];
+            const type_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, last_type);
+
+            const ptr_index = self.exprs.items.len;
+            var ptr: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.ptr,
+                false,
+            );
+            try self.exprs.append(self.arena, ptr.expr);
+
+            const expected_value_index = self.exprs.items.len;
+            var expected_value: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.expected_value,
+                false,
+            );
+            try self.exprs.append(self.arena, expected_value.expr);
+
+            const new_value_index = self.exprs.items.len;
+            var new_value: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.new_value,
+                false,
+            );
+            try self.exprs.append(self.arena, new_value.expr);
+
+            const success_order_index = self.exprs.items.len;
+            var success_order: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.success_order,
+                false,
+            );
+            try self.exprs.append(self.arena, success_order.expr);
+
+            const failure_order_index = self.exprs.items.len;
+            var failure_order: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.failure_order,
+                false,
+            );
+            try self.exprs.append(self.arena, failure_order.expr);
+
+            const cmpxchg_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, .{ .cmpxchg = .{ .name = @tagName(tags[inst_index]), .type = type_index, .ptr = ptr_index, .expected_value = expected_value_index, .new_value = new_value_index, .success_order = success_order_index, .failure_order = failure_order_index } });
+            return DocData.WalkResult{
+                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+                .expr = .{ .cmpxchgIndex = cmpxchg_index },
+            };
+        },
         .str => {
             const str = data[inst_index].str.get(file.zir);