Skip to content

Commit

Permalink
xdrgen: XDR width for union types
Browse files Browse the repository at this point in the history
Not yet complete.

The tool doesn't do any math yet. Thus, even though the maximum XDR
width of a union is the width of the union enumerator plus the width
of its largest arm, we're using the sum of all the elements of the
union for the moment.

This means that buffer size requirements are overestimated, and that
the generated maxsize macro cannot yet be used for determining data
element alignment in the XDR buffer.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
  • Loading branch information
Chuck Lever committed Nov 11, 2024
1 parent 447dc1e commit ce5a75d
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions tools/net/sunrpc/xdrgen/xdr_ast.py
Original file line number Diff line number Diff line change
Expand Up @@ -450,9 +450,35 @@ class _XdrUnion(_XdrAst):
cases: List[_XdrCaseSpec]
default: _XdrDeclaration

def max_width(self) -> int:
"""Return width of type in XDR_UNITS"""
max_width = 0
for case in self.cases:
if case.arm.max_width() > max_width:
max_width = case.arm.max_width()
if self.default:
if self.default.arm.max_width() > max_width:
max_width = self.default.arm.max_width()
return 1 + max_width

def symbolic_width(self) -> List:
"""Return list containing XDR width of type's components"""
max_width = 0
for case in self.cases:
if case.arm.max_width() > max_width:
max_width = case.arm.max_width()
width = case.arm.symbolic_width()
if self.default:
if self.default.arm.max_width() > max_width:
max_width = self.default.arm.max_width()
width = self.default.arm.symbolic_width()
return symbolic_widths[self.discriminant.name] + width

def __post_init__(self):
structs.add(self.name)
pass_by_reference.add(self.name)
max_widths[self.name] = self.max_width()
symbolic_widths[self.name] = self.symbolic_width()


@dataclass
Expand Down

0 comments on commit ce5a75d

Please sign in to comment.