riscv calling convention 指定了哪一个register是被调用函数的caller保存的,哪一个register是被callee保存的。venus提供了一个-cc的命令来检查和calling convention相关的bug。 使用cc前,注意: cc不能检查到所有的calling convention问题,有些需要自己去手动的找 cc只能检查在.globl声明的函数导致的calling convention问题...
Vector Calling Convention 当前考虑的参数类型为 RISC-V Vector Instrinsic Document 中定义的类型,包括 Vector Mask Type、Vector Data Type、Tuple Vector Data Type 三类。其中 Vector Mask Type 永远占用一个寄存器,Vector Data Type 根据其LMUL大小占用相应个数寄存器(LMUL 小于 1 时当作 1 处理),并且第一个...
(我觉得有几个答案补充的很好). 实际上 ABI 兼容性是一个和编译器等都有关的话题。ABI 定义了 calling convention,同时 ABI 定义了约束:有些寄存器是不可写的。 同时,你可以在上面的图里面看到很奇妙的事情,这里没有再使用x0-x15这样的记号,而是用了s0fp这样相对来说名字好理解一些的。 int Leaf(int g, ...
在这里使用了 Unix 的文件后缀命名习惯,分别对应 MS-DOS 中的.C, .ASM, .OBJ, .LIB 和.EXE。 3.2 函数调用规范(Calling convention) 函数调用过程通常分为 6 个阶段。 1. 将参数存储到函数能够访问到的位置; 2. 跳转到函数开始位置(使用 RV32I 的 jal 指令); 3. 获取函数需要的局部存储资源,按需保存...
标准的软件调用约定(calling convention)用x1寄存器作为返回地址寄存器(rd),也可以用x5作为备用的链接寄存器(link register)。因为JAL指令中的offset是相对于PC的偏移量,在编写时需要精确的地址差值,且任意添加/删除一条汇编指令,JAL中的偏移量可能就需要再次修改,这给JAL指令的使用带来了很大的负担,所以,一般在用JAL指...
标准的软件调用约定(calling convention)用x1寄存器作为返回地址寄存器(rd),也可以用x5作为备用的链接寄存器(link register)。因为JAL指令中的offset是相对于PC的偏移量,在编写时需要精确的地址差值,且任意添加/删除一条汇编指令,JAL中的偏移量可能就需要再次修改,这给JAL指令的使用带来了很大的负担,所以,一般在用JAL指...
RISC-V调用约定有两种:传统调用约定和新的整数调用约定(Integer Calling Convention)。 传统调用约定(C调用约定)是最早定义的调用约定,它将函数参数按顺序依次压入栈中,然后调用函数。函数返回时,返回值放在寄存器a0中。该调用约定适用于所有标准的RISC-V编译器和操作系统,是RISC-V生态系统中广泛采用的一种约定。 整...
ABI的全称是Application Binary Interface,是二进制级别的协议,它指导着编译器如何生成代码和二进制程序,同样也指导着用户如何写汇编代码。它主要包含函数调用约定(calling convention)、数据的对齐方式等内容。其中对代码密度影响最大的就是函数调用约定,它规定了堆栈寄存器、链接寄存器、哪些寄存器寄存器需要在函数头尾...
目前,社区正在设计、制定针对嵌入式领域的新的ABI——EABI(Embedded ABI),它不仅会调整Calling Convention以减少中断延迟,也会考虑代码密度,使用量化分析地方法设计出一套对嵌入式领域优化的ABI。平头哥作为EABI Task Group的Co-Chair,也参与其中推动EABI的前进。
ABI的全称是Application Binary Interface,是二进制级别的协议,它指导着编译器如何生成代码和二进制程序,同样也指导着用户如何写汇编代码。它主要包含函数调用约定(calling convention)、数据的对齐方式等内容。 其中对代码密度影响最大的就是函数调用约定,它规定了堆栈寄存器、链接寄存器、哪些寄存器需要在函数头尾保存和恢复...