d的栈对齐问题
如果N>平台栈对齐
,则不考虑栈变量
的align(N)
.
这对栈对齐
到16
字节的64
位编译中的float8
(AVX
,32
字节对齐),来说尤其
如此.注意AVX
理论上,也可在32
位编译,但是目前dmd
既不暴露intrinsic
,也不暴露内联汇编
中的YMM0-YMM7
,所以还不会在那碰到该问题
.
据我所知,主要的gcc,icc,llvm
编译器,都支持对齐>=16
的正确栈对齐
.因此,也应该根据C互操作
研究.
不,如果align<=栈对齐
,则错误
,即不会忽略栈变量
.
好吧,很烦人.破损代码:
align(16) uint[128] state;
asm { fxsave state; }
修复代码:
uint[128 + 4] buf;
auto state = cast(uint*)((cast(size_t)buf.ptr + 0xF) & ~size_t(0xF));
version (X86_64)
asm { mov RAX, state; fxsave 0[RAX]; }
else
asm { mov EAX, state; fxsave 0[EAX]; }
问题阻止了这里,在具有4字节
栈对齐的Win32
上,以下断定一般会失败:
void main() {
byte a;
align(8) byte b;
assert((cast(size_t) &b) % 8 == 0);
}
解决
方法之一是:
1
.用最大对齐
收集所有局部变量
,并在构变量中按字段
放置它们
.
2
.构中的第一个
字段有足够的对齐填充
来覆盖最坏时所需
的对齐字节
.如,如果栈
对齐为4
,而字段对齐
为16
,则字段需要
的大小为12
字节.
3
.创建特殊的指向
在函数入口计算的构字段
的对齐开始
的P
指针变量:
P = (&struct + 15) & ~0xF;
//对`16`字节对齐
4
.按P->field
,重写
构中所有变量
的引用
5
.注意它要与gc
分配的闭包
一起工作
在胶水
代码中,所有这些应该都是可行
的,不必修改后端
.
当然,对未阻塞
代码,目前可显式
这样.
对齐栈
更容易,它在64
位平台和OSX
上已做过了,但在Win32
上没有.我也试着为Win32
启用它:
这里
但是测试包
失败了,因此需要一些调试
.
增加对齐
会带来一些
问题:
1
.不符合CABI
.即,如果其他
函数不遵循这些对齐方式
,而从D调用
它们并传递回调
,则回调
不会对齐.或,如果C函数
调用D函数
,则不会
对齐.
2
.一些SIMD
指令的对齐要求越来越大
.增加
函数对齐
并前途不大.
3
.很少有较大对齐
,但是增加对齐
,对每个函数都要这样
,从而占用
更多栈空间
.
但是,实际表明,DMD
中闭包
代码,几乎正是实现在栈上
分配的"对齐闭包"
所需要的.
不需要修改
代码生成器.
部分修复:这里
事情如下,苏莱曼.萨赫米
已修复了大半
该问题,但2019
年PR
合并时,机器人
并没有关闭
该问题:
这里
算法如下:
通过迭代
函数中所有局部变量
类型,来找到最大对齐
.如果它大于平台保证的最小栈对齐
,则在函数开头
生成代码,来对齐
栈到所需对齐
.如:
struct S { align(128) int i; }
void f()
{
S x;
}
生成:
void onlineapp.f():
push RBP
mov RBP,RSP
and RSP,0FFFFFF80h
//栈指针对齐到128的倍数
sub RSP,080h
其局限性如下:
1,它仅针对64
位版本和(&& (I64 || config.exe == EX_OSX))
的OSX
版本.
2,它只查看变量类型
,所以仍假定'align(128)int x;
有4
对齐.
我有点好奇SS
方法,是如何解决
要求的一个是参数
另一个是其余
的两个基指针
问题的.然后是嵌套
函数访问外部函数
栈帧问题,难道不需要两个
基址指针吗?在动态
闭包中对齐变量
如何?
我不能说我理解他的方法.
我的PR
修复了动态闭包
问题.一旦合并
了该问题,后续
修复可解决其他
问题.不需要修改
代码生成器.也简单了很多.
更多进展:这里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现