diff options
| author | Evan Haas <evan@lagerdata.com> | 2021-06-17 17:52:26 -0700 |
|---|---|---|
| committer | Evan Haas <evan@lagerdata.com> | 2021-07-22 08:09:46 -0700 |
| commit | dc4fa83dd767096595ae4e84c3a7dbfd80cbf115 (patch) | |
| tree | ee5da4ef9d5ca57c8f7d3181bd17a6feebec8762 /src/translate_c/ast.zig | |
| parent | 18b8738069268cc913bbae9580d2d170618a2ae9 (diff) | |
| download | zig-dc4fa83dd767096595ae4e84c3a7dbfd80cbf115.tar.gz zig-dc4fa83dd767096595ae4e84c3a7dbfd80cbf115.zip | |
translate-c: add framework for special-casing macros
Some macros (for example any macro that uses token pasting) cannot be
directly translated to Zig, but may nevertheless still admit a Zig
implementation. This provides a mechanism for matching macros against
templates and mapping them to functions implemented in c_translation.zig.
A macro matches a template if it contains the same sequence of tokens, except
that the name and parameters may be renamed. No attempt is made to
semantically analyze the macro. For example the following two macros are
considered equivalent:
```C
```
But the following two are not:
```C
```
Diffstat (limited to 'src/translate_c/ast.zig')
| -rw-r--r-- | src/translate_c/ast.zig | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/translate_c/ast.zig b/src/translate_c/ast.zig index 6db59afd96..fa6b749589 100644 --- a/src/translate_c/ast.zig +++ b/src/translate_c/ast.zig @@ -193,6 +193,8 @@ pub const Node = extern union { helpers_flexible_array_type, /// @import("std").zig.c_translation.shuffleVectorIndex(lhs, rhs) helpers_shuffle_vector_index, + /// @import("std").zig.c_translation.Macro.<operand> + helpers_macro, /// @import("std").meta.Vector(lhs, rhs) std_meta_vector, /// @import("std").mem.zeroes(operand) @@ -339,6 +341,7 @@ pub const Node = extern union { .identifier, .warning, .type, + .helpers_macro, => Payload.Value, .discard => Payload.Discard, .@"if" => Payload.If, @@ -1112,6 +1115,16 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex { .data = undefined, }); }, + .helpers_macro => { + const payload = node.castTag(.helpers_macro).?.data; + const chain = [_][]const u8{ + "zig", + "c_translation", + "Macros", + payload, + }; + return renderStdImport(c, &chain); + }, .string_slice => { const payload = node.castTag(.string_slice).?.data; @@ -2310,6 +2323,7 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex { .bit_or_assign, .bit_xor_assign, .assign, + .helpers_macro, => { // these should never appear in places where grouping might be needed. unreachable; |
