Skip to content

Commit e9e1e7e

Browse files
committed
xdrgen: Add generator code for XDR width macros
Introduce logic in the code generators to emit maxsize (XDR width) definitions. In C, these are pre-processor macros. Signed-off-by: Chuck Lever <[email protected]>
1 parent ce5a75d commit e9e1e7e

File tree

15 files changed

+107
-6
lines changed

15 files changed

+107
-6
lines changed

tools/net/sunrpc/xdrgen/generators/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,7 @@ def emit_definition(self, node: _XdrAst) -> None:
111111
def emit_encoder(self, node: _XdrAst) -> None:
112112
"""Emit one encoder function for this XDR type"""
113113
raise NotImplementedError("Encoder generation not supported")
114+
115+
def emit_maxsize(self, node: _XdrAst) -> None:
116+
"""Emit one maxsize macro for this XDR type"""
117+
raise NotImplementedError("Maxsize macro generation not supported")

tools/net/sunrpc/xdrgen/generators/enum.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"""Generate code to handle XDR enum types"""
55

66
from generators import SourceGenerator, create_jinja2_environment
7-
from xdr_ast import _XdrEnum, public_apis, big_endian
7+
from xdr_ast import _XdrEnum, public_apis, big_endian, get_header_name
88

99

1010
class XdrEnumGenerator(SourceGenerator):
@@ -51,3 +51,14 @@ def emit_encoder(self, node: _XdrEnum) -> None:
5151
else:
5252
template = self.environment.get_template("encoder/enum.j2")
5353
print(template.render(name=node.name))
54+
55+
def emit_maxsize(self, node: _XdrEnum) -> None:
56+
"""Emit one maxsize macro for an XDR enum type"""
57+
macro_name = get_header_name().upper() + "_" + node.name + "_sz"
58+
template = self.environment.get_template("maxsize/enum.j2")
59+
print(
60+
template.render(
61+
macro=macro_name,
62+
width=" + ".join(node.symbolic_width()),
63+
)
64+
)

tools/net/sunrpc/xdrgen/generators/pointer.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
1313
from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
1414
from xdr_ast import _XdrOptionalData, _XdrPointer, _XdrDeclaration
15-
from xdr_ast import public_apis
15+
from xdr_ast import public_apis, get_header_name
1616

1717

1818
def emit_pointer_declaration(environment: Environment, node: _XdrPointer) -> None:
@@ -247,6 +247,18 @@ def emit_pointer_encoder(environment: Environment, node: _XdrPointer) -> None:
247247
print(template.render())
248248

249249

250+
def emit_pointer_maxsize(environment: Environment, node: _XdrPointer) -> None:
251+
"""Emit one maxsize macro for an XDR pointer type"""
252+
macro_name = get_header_name().upper() + "_" + node.name + "_sz"
253+
template = get_jinja2_template(environment, "maxsize", "pointer")
254+
print(
255+
template.render(
256+
macro=macro_name,
257+
width=" + ".join(node.symbolic_width()),
258+
)
259+
)
260+
261+
250262
class XdrPointerGenerator(SourceGenerator):
251263
"""Generate source code for XDR pointer"""
252264

@@ -270,3 +282,7 @@ def emit_decoder(self, node: _XdrPointer) -> None:
270282
def emit_encoder(self, node: _XdrPointer) -> None:
271283
"""Emit one encoder function for an XDR pointer type"""
272284
emit_pointer_encoder(self.environment, node)
285+
286+
def emit_maxsize(self, node: _XdrPointer) -> None:
287+
"""Emit one maxsize macro for an XDR pointer type"""
288+
emit_pointer_maxsize(self.environment, node)

tools/net/sunrpc/xdrgen/generators/struct.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
1313
from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
1414
from xdr_ast import _XdrOptionalData, _XdrStruct, _XdrDeclaration
15-
from xdr_ast import public_apis
15+
from xdr_ast import public_apis, get_header_name
1616

1717

1818
def emit_struct_declaration(environment: Environment, node: _XdrStruct) -> None:
@@ -247,6 +247,18 @@ def emit_struct_encoder(environment: Environment, node: _XdrStruct) -> None:
247247
print(template.render())
248248

249249

250+
def emit_struct_maxsize(environment: Environment, node: _XdrStruct) -> None:
251+
"""Emit one maxsize macro for an XDR struct type"""
252+
macro_name = get_header_name().upper() + "_" + node.name + "_sz"
253+
template = get_jinja2_template(environment, "maxsize", "struct")
254+
print(
255+
template.render(
256+
macro=macro_name,
257+
width=" + ".join(node.symbolic_width()),
258+
)
259+
)
260+
261+
250262
class XdrStructGenerator(SourceGenerator):
251263
"""Generate source code for XDR structs"""
252264

@@ -270,3 +282,7 @@ def emit_decoder(self, node: _XdrStruct) -> None:
270282
def emit_encoder(self, node: _XdrStruct) -> None:
271283
"""Emit one encoder function for an XDR struct type"""
272284
emit_struct_encoder(self.environment, node)
285+
286+
def emit_maxsize(self, node: _XdrStruct) -> None:
287+
"""Emit one maxsize macro for an XDR struct type"""
288+
emit_struct_maxsize(self.environment, node)

tools/net/sunrpc/xdrgen/generators/typedef.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from xdr_ast import _XdrFixedLengthOpaque, _XdrVariableLengthOpaque
1313
from xdr_ast import _XdrFixedLengthArray, _XdrVariableLengthArray
1414
from xdr_ast import _XdrOptionalData, _XdrVoid, _XdrDeclaration
15-
from xdr_ast import public_apis
15+
from xdr_ast import public_apis, get_header_name
1616

1717

1818
def emit_typedef_declaration(environment: Environment, node: _XdrDeclaration) -> None:
@@ -230,6 +230,18 @@ def emit_typedef_encoder(environment: Environment, node: _XdrDeclaration) -> Non
230230
raise NotImplementedError("typedef: type not recognized")
231231

232232

233+
def emit_typedef_maxsize(environment: Environment, node: _XdrDeclaration) -> None:
234+
"""Emit a maxsize macro for an XDR typedef"""
235+
macro_name = get_header_name().upper() + "_" + node.name + "_sz"
236+
template = get_jinja2_template(environment, "maxsize", node.template)
237+
print(
238+
template.render(
239+
macro=macro_name,
240+
width=" + ".join(node.symbolic_width()),
241+
)
242+
)
243+
244+
233245
class XdrTypedefGenerator(SourceGenerator):
234246
"""Generate source code for XDR typedefs"""
235247

@@ -253,3 +265,7 @@ def emit_decoder(self, node: _XdrTypedef) -> None:
253265
def emit_encoder(self, node: _XdrTypedef) -> None:
254266
"""Emit one encoder function for an XDR typedef"""
255267
emit_typedef_encoder(self.environment, node.declaration)
268+
269+
def emit_maxsize(self, node: _XdrTypedef) -> None:
270+
"""Emit one maxsize macro for an XDR typedef"""
271+
emit_typedef_maxsize(self.environment, node.declaration)

tools/net/sunrpc/xdrgen/generators/union.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from generators import SourceGenerator
99
from generators import create_jinja2_environment, get_jinja2_template
1010

11-
from xdr_ast import _XdrBasic, _XdrUnion, _XdrVoid, big_endian
12-
from xdr_ast import _XdrDeclaration, _XdrCaseSpec, public_apis
11+
from xdr_ast import _XdrBasic, _XdrUnion, _XdrVoid, get_header_name
12+
from xdr_ast import _XdrDeclaration, _XdrCaseSpec, public_apis, big_endian
1313

1414

1515
def emit_union_declaration(environment: Environment, node: _XdrUnion) -> None:
@@ -234,6 +234,18 @@ def emit_union_encoder(environment, node: _XdrUnion) -> None:
234234
print(template.render())
235235

236236

237+
def emit_union_maxsize(environment: Environment, node: _XdrUnion) -> None:
238+
"""Emit one maxsize macro for an XDR union type"""
239+
macro_name = get_header_name().upper() + "_" + node.name + "_sz"
240+
template = get_jinja2_template(environment, "maxsize", "union")
241+
print(
242+
template.render(
243+
macro=macro_name,
244+
width=" + ".join(node.symbolic_width()),
245+
)
246+
)
247+
248+
237249
class XdrUnionGenerator(SourceGenerator):
238250
"""Generate source code for XDR unions"""
239251

@@ -257,3 +269,7 @@ def emit_decoder(self, node: _XdrUnion) -> None:
257269
def emit_encoder(self, node: _XdrUnion) -> None:
258270
"""Emit one encoder function for an XDR union"""
259271
emit_union_encoder(self.environment, node)
272+
273+
def emit_maxsize(self, node: _XdrUnion) -> None:
274+
"""Emit one maxsize macro for an XDR union"""
275+
emit_union_maxsize(self.environment, node)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{# SPDX-License-Identifier: GPL-2.0 #}
2+
#define {{ '{:<31}'.format(macro) }} ({{ width }})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{# SPDX-License-Identifier: GPL-2.0 #}
2+
#define {{ '{:<31}'.format(macro) }} \
3+
({{ width }})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{# SPDX-License-Identifier: GPL-2.0 #}
2+
#define {{ '{:<31}'.format(macro) }} \
3+
({{ width }})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{# SPDX-License-Identifier: GPL-2.0 #}
2+
#define {{ '{:<31}'.format(macro) }} \
3+
({{ width }})

0 commit comments

Comments
 (0)