[codegen] Add static storage class to global variables for size optimization (#12616)

This commit is contained in:
J. Nick Koston
2025-12-22 07:03:17 -10:00
committed by GitHub
parent 52eb08f48f
commit 74b075d3cf
4 changed files with 20 additions and 10 deletions
+15 -7
View File
@@ -51,15 +51,19 @@ class AssignmentExpression(Expression):
class VariableDeclarationExpression(Expression):
__slots__ = ("type", "modifier", "name")
__slots__ = ("type", "modifier", "name", "static")
def __init__(self, type_, modifier, name):
def __init__(
self, type_: "MockObj", modifier: str, name: ID, *, static: bool = False
) -> None:
self.type = type_
self.modifier = modifier
self.name = name
self.static = static
def __str__(self):
return f"{self.type} {self.modifier}{self.name}"
def __str__(self) -> str:
prefix = "static " if self.static else ""
return f"{prefix}{self.type} {self.modifier}{self.name}"
class ExpressionList(Expression):
@@ -507,13 +511,17 @@ def with_local_variable(id_: ID, rhs: SafeExpType, callback: Callable, *args) ->
CORE.add(RawStatement("}")) # output closing curly brace
def new_variable(id_: ID, rhs: SafeExpType, type_: "MockObj" = None) -> "MockObj":
def new_variable(
id_: ID, rhs: SafeExpType, type_: "MockObj" = None, *, static: bool = True
) -> "MockObj":
"""Declare and define a new variable, not pointer type, in the code generation.
:param id_: The ID used to declare the variable.
:param rhs: The expression to place on the right hand side of the assignment.
:param type_: Manually define a type for the variable, only use this when it's not possible
to do so during config validation phase (for example because of template arguments).
:param static: If True (default), declare with static storage class for optimization.
Set to False when the variable must have external linkage (e.g., to match library declarations).
:return: The new variable as a MockObj.
"""
@@ -522,7 +530,7 @@ def new_variable(id_: ID, rhs: SafeExpType, type_: "MockObj" = None) -> "MockObj
obj = MockObj(id_, ".")
if type_ is not None:
id_.type = type_
decl = VariableDeclarationExpression(id_.type, "", id_)
decl = VariableDeclarationExpression(id_.type, "", id_, static=static)
CORE.add_global(decl)
assignment = AssignmentExpression(None, "", id_, rhs)
CORE.add(assignment)
@@ -544,7 +552,7 @@ def Pvariable(id_: ID, rhs: SafeExpType, type_: "MockObj" = None) -> "MockObj":
obj = MockObj(id_, "->")
if type_ is not None:
id_.type = type_
decl = VariableDeclarationExpression(id_.type, "*", id_)
decl = VariableDeclarationExpression(id_.type, "*", id_, static=True)
CORE.add_global(decl)
assignment = AssignmentExpression(None, None, id_, rhs)
CORE.add(assignment)