mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 13:27:57 +02:00
xdrgen: XDR width for union types
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>
This commit is contained in:
parent
447dc1efeb
commit
ce5a75d993
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user