138 lines
5.3 KiB
Plaintext
138 lines
5.3 KiB
Plaintext
import lib.core.Gen.GenApi as GenApi
|
||
import t, c
|
||
from stdint import *
|
||
import ast
|
||
import llvmlite
|
||
import memhub
|
||
import string
|
||
import stdio
|
||
import stdlib
|
||
import sys
|
||
import viperlib
|
||
import w32.fileio as fileio
|
||
import lib.core.VLogger as VLogger
|
||
import lib.core.Handles.HandlesBase as HandlesBase
|
||
import lib.core.Handles.HandlesTranslator as HT
|
||
import lib.core.Handles.HandlesExpr as HandlesExpr
|
||
import lib.Stub.StubMerger as StubMerger
|
||
import lib.core.Gen.Generator as Generator
|
||
|
||
# ============================================================
|
||
# 全局 gen 单例(模块级镜像,同 HandlesType/HandlesStruct 模式)
|
||
# ============================================================
|
||
_g_gen: Generator.Generator | t.CPtr = None
|
||
|
||
|
||
# ============================================================
|
||
# 本地常量(阶段 E 拆分时随函数块误删,补回;子模块经 HandlesExprCall.常量 引用)
|
||
# ============================================================
|
||
_CEXPORT_MAX: t.CDefine = 256
|
||
ASM_MAX_OPERANDS: t.CDefine = 16
|
||
ASM_TEXT_BUF_SIZE: t.CDefine = 2048
|
||
ASM_CONST_BUF_SIZE: t.CDefine = 512
|
||
ASM_ARGS_BUF_SIZE: t.CDefine = 512
|
||
ASM_LINE_BUF_SIZE: t.CDefine = 4096
|
||
LLVMIR_MAX_OPS: t.CDefine = 16
|
||
LLVMIR_TEMPLATE_BUF: t.CDefine = 512
|
||
MAX_CLOSURE_NAMES: t.CDefine = 128
|
||
MAX_FUNC_PTR_SIGS: t.CDefine = 64
|
||
GLOBAL_FUNC_MAX: t.CDefine = 8192
|
||
GLOBAL_DEFAULTS_MAX: t.CDefine = 4096
|
||
|
||
|
||
|
||
# ============================================================
|
||
# AsmOperand - 内联汇编操作数条目
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class AsmOperand:
|
||
"""内联汇编操作数条目"""
|
||
Value: llvmlite.Value | t.CPtr # 输入值或输出 alloca
|
||
Constraint: str # 约束字符串 (如 "r", "=r")
|
||
IsOutput: int # 1=输出, 0=输入
|
||
|
||
|
||
|
||
|
||
|
||
|
||
# ============================================================
|
||
# FuncEntry 结构体(用于函数表)
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class FuncEntry:
|
||
"""函数表条目"""
|
||
Name: str
|
||
Func: llvmlite.Function | t.CPtr
|
||
Defaults: t.CVoid | t.CPtr # defaults 列表节点指针 (list[AST | CPtr]),None=无默认值
|
||
DefaultCount: int # 默认值数量
|
||
ParamCount: int # 形参数量(不含 self)
|
||
# TypeStr: 函数类型文本(stdlib 深拷贝,跨文件安全)
|
||
# 1b 每文件 reset_to(mark1) 回收 pool 内 Function 对象后,
|
||
# vtable 生成 find_func_global 读类型改用此文本,避免悬空。
|
||
TypeStr: str
|
||
|
||
|
||
|
||
|
||
|
||
@t.NoVTable
|
||
class FuncDefaultsEntry:
|
||
"""默认参数表条目"""
|
||
Name: str
|
||
Defaults: t.CVoid | t.CPtr # defaults 列表节点指针 (list[AST | CPtr])(pool 内,可能被 reset)
|
||
DefaultCount: int
|
||
ParamCount: int # 形参数量(不含 self)
|
||
# 常量快照(stdlib 分配,跨文件永久存活):
|
||
# 注册时提取每个默认值 Constant 的值,跨模块调用时优先用快照重建常量 IR,
|
||
# 避免读取已被 1b reset_to(mark1) 回收的 pool 内 AST。
|
||
ConstKinds: t.CInt | t.CPtr # const_kind 数组(DefaultCount 个 i32)
|
||
ConstInts: t.CInt64T | t.CPtr # int_val 数组(DefaultCount 个 i64)
|
||
ConstStrs: t.CSizeT | t.CPtr # str_val 指针数组(DefaultCount 个 i8*)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
# ============================================================
|
||
# ExprCallHandle - 函数调用处理器(Mixin 继承模式)
|
||
#
|
||
# HandleCall / HandlePrintfCall 提供 trans 接口
|
||
# ============================================================
|
||
@t.NoVTable
|
||
class ExprCallHandle(HandlesBase.Mixin):
|
||
"""函数调用处理器:继承 Mixin 获得 Trans 回指针"""
|
||
|
||
def __init__(self, trans: HT.Translator | t.CPtr):
|
||
self.Trans = trans
|
||
|
||
# ============================================================
|
||
# HandleCall - 翻译函数调用,返回 call 结果 Value
|
||
# ============================================================
|
||
def HandleCall(self, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr:
|
||
"""翻译函数调用,从 self.Trans 获取共享状态"""
|
||
return GenApi.translate_call(
|
||
self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module,
|
||
node,
|
||
self.Trans._funcs, self.Trans._func_count, self.Trans)
|
||
|
||
# ============================================================
|
||
# HandlePrintfCall - 翻译 printf 调用
|
||
# ============================================================
|
||
def HandlePrintfCall(self, cl: ast.Call | t.CPtr):
|
||
"""翻译 printf 调用,从 self.Trans 获取共享状态"""
|
||
GenApi.translate_printf_call(
|
||
self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module,
|
||
cl, self.Trans)
|
||
|
||
# ============================================================
|
||
# HandlePrintCall - 翻译 print 调用
|
||
# ============================================================
|
||
def HandlePrintCall(self, cl: ast.Call | t.CPtr):
|
||
"""翻译 print 调用(类型感知格式化 + 默认换行)"""
|
||
GenApi.translate_print_call(
|
||
self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module,
|
||
cl, self.Trans)
|