调用约定(Calling Conventions

LLVM functionscalls and invokes 可以带有一个可选的调用约定来指明调用方式。每一对 caller/callee(调用者/被调用者)的调用约定必须相匹配,不然这个程序的行为是未定义的。下面的是LLVM支持的调用约定形式,并且在未来可能会加入更多:

ccc” - The C calling convention

这个调用约定(在没有标识其他调用约定时,为默认调用约定)匹配其目标到C调用约定。这个调用约定支持变长参数函数调用并可容忍函数的声明和实现之间存在某些不匹配的地方(像正常的 C一样)

fastcc” - The fast calling convention
这个调用约定企图使调用尽可能的快速(如,通过寄存器传递参数)。这个调用约定允许目标使用任何技巧来为其产生快速的代码,不要求符合外部指定的ABI (Application Binary Interface).  尾部调用只能在theGHC or the HiPE convention 被使用的时候优化。这种调用约定不支持变长参数切要求所有被调用者的原型与函数定义的原型相匹配。
coldcc” - The cold calling convention
这种调用约定企图使调用者内的代码在假定这个调用不会被经常执行的情况下尽可能的有效率。像这种情况,这些调用通常会保护所有寄存器,因此这个调用不会破坏任何调用者内的生存范围(live ranges)。这种调用约定不支持变长参数切要求所有被调用者的原型与函数定义的原型相匹配。更进一步的,内联器(inliner)不会考虑把这种函数进行内联。
cc 10” - GHC convention
这种调用约定被明确的实现来用于 Glasgow Haskell Compiler (GHC)。它传递所有东西到寄存器中,并通过禁止被调用者保存寄存器来实现这种极端的方式。这种调用约定不应该轻易地使用除非像在实现函数式编程语言时,一个可选的the register pinning性能技术经常被使用的情况下。在目前只有X86支持这种约定切它有以下限制:
~ 在X86-32下只支持长度大于4bit的类型的形参。不支持浮点型。
~ 在X86-64下只支持长度大于10bit的类型形参且只支持 (6 floating point parameters?)
这种调用约定支持 tail call optimization 但要求调用者和被调用者都使用这种调用约定。
cc 11” - The HiPE calling convention
这种调用约定被明确实现来用于High-Performance Erlang (HiPE) compiler,the Ericsson’s Open Source Erlang/OTP system的本地编译器。它比普通的C调用约定使用了更多寄存器来用于实参的传递和定义非调用者保存寄存器(no callee-saved registers)。这个调用约定正确地支持尾部调用优化但要求调用者和被调用者都是用这个调用约定。它使用一个与GHC’s 约定相似的 register pinning 机制来保持被压在指定硬件寄存器上的运行时组件的频繁访问。在目前,只有X86支持这种调用约定(包括32位和64位)。
webkit_jscc” - WebKit’s JavaScript calling convention
这种调用约定被实现用于WebKit FTL JIT。它从右到左向stack传递实参(像cdcel 调用约定一样),并且返回一个值到平台所定义的返回寄存器中。
anyregcc” - Dynamic calling convention for code patching
这种特殊的调用约定支持修补一段任意的代码序列来取代一个调用地点(call site)。这种调用约定强制调用的实参到寄存器中但允许他们被动态分配。这种调用约定只能被llvm中的调用使用。这种调用约定是实验性的。patchpoint because only this intrinsic records the location of its arguments in a side table.See Stack maps and patch points in LLVM.“
preserve_mostcc” - The PreserveMost calling convention
这种调用约定企图使调用者中的代码尽可能地少受干扰。这种调用约定在如何传递实参和返回值上与C调用约定完全一致,但“preserve_mostcc” 使用不同的调用者保存寄存器和非调用者保存寄存器(caller/callee-saved register)集。这样可以减轻在调用开始和结束需要保存和恢复大量寄存器集的负担。如果实参传递到非调用者保存寄存器(callee-saved registers),那么他们会被被调用者保护起来。不能使用从非调用者保存寄存器(callee-saved registers)返回的值。
~ 在X86-64中被调用者保护所有普通目的寄存器,除了R11。R11可能被用作scratch register。浮点寄存器(XMMs/YMMs)不会被保护且需要被调用者保护。
这种调用约定背后的想法支持调用拥有一个 hot path 和一个 cold path 的运行期函数。hot path通常是不需要太多寄存器的小代码块。cold path可能需要调用另一个函数并且仅仅需要保护那些未被调用者保存的调用者保存寄存器(caller-saved registers)。“preserve_mostcc” 调用约定在调用者保存寄存器和非调用者保存寄存器(caller/callee-saved register)数量方面要小很多(@note -- 因为coldcc需要在每一个函数内部保存所有寄存器导致了很多不必要的操作),但它们被使用于不同类型的函数调用。“coldcc” 是用于那些很少被执行的函数调用,然而“preserve_mostcc”函数调用主要部分在于hot path且肯定被执行多次。(whereas preserve_mostcc function calls are intended to be on the hot path and definitely executed a lot.)此外,“preserve_mostcc”不能防止内联器(linker)内联这个函数调用。
这种调用约定将会被使用到Objective-C运行期的一个未来版本,因此该调用约定在目前仍然被认为是实验性的。计时这个约定已经被创建来优化确定的Objective-C运行期的运行期调用,它并不受限于Objective-C的运行期,在未来可能会被使用于其他运行期。当前的实现仅支持X86-64,但在未来会试吃更多得体系架构。
preserve_allcc” - The PreserveAll calling convention
这种调用约定企图使调用者中的代码尽可能地少受干扰。这种调用约定在如何传递实参和返回值上与C调用约定完全一致,但“preserve_mostcc” 使用不同的调用者保存寄存器和非调用者保存寄存器(caller/callee-saved register)集。这样可以减轻在调用开始和结束需要保存和恢复大量寄存器集的负担。如果实参传递到非调用者保存寄存器(callee-saved registers),那么他们会被被调用者保护起来。不能使用从非调用者保存寄存器(callee-saved registers)返回的值。
~ 在X86-64中被调用者保护所有普通目的寄存器,除了R11。R11可能被用作scratch register。浮点寄存器(XMMs/YMMs)不会被保护且需要被调用者保护。
这种调用约定背后的想法支持不需要调用其它函数的运行期函数。
这种调用约定,类似于“preserve_mostcc”调用约定,会被使用于Objective-C运行期的一个未来版本,在目前被认为是实验性的
cc <n>” - Numbered convention
任何调用约定肯能被一个数字标识,来允许作为一个与特定目标相关的调用约定。与特定目标相关的调用约定开始于数字64。

更多得调用约定可能被增加/定义在需要的基础上,从而支持Pascal调用约定或者其他任何知名的依赖于目标的调用约定。

LLVM language 参考手册(译)(2)的更多相关文章

  1. LLVM language 参考手册 翻译停止相关

    再翻译LLVM language 参考手册的时候,个人感觉很多东西都不是很懂,因此打算学习完编译原理后再去继续研究翻译,多有不便望见谅

  2. LLVM language 参考手册(译)(1)

    LLVM Language Reference Manual 摘要 这个文档是一个LLVM汇编语言的参考手册.LLVM是一个基于Static Single Assignment(SSA - 静态单赋值 ...

  3. LLVM language 参考手册(译)(3)

    可见性模式(Visibility Styles) 所有全局变量和函数具有以下的可见性模式之一: “default” - Default style 在那些使用ELF object file格式的平台( ...

  4. LLVM language 参考手册(译)(6)

    模块级内联汇编(Module-Level Inline Assembly) 模块包含“module-level inline assembly”块,这与GCC中的“file scope inline ...

  5. LLVM language 参考手册(译)(5)

    垃圾回收器名称(Garbage Collector Names) 每一个函数可以制定一个垃圾回收期的名称,这个名称是一个简单的字符串: define void @f() gc "name&q ...

  6. LLVM language 参考手册(译)(4)

    函数(Functions) LLVM函数定义由“define” 关键字,一个可选的链接标识,一个可选的可见性模式,一个可选的DLL存储类别,一个可选的调用约定,一个可选的 unnamed_addr 属 ...

  7. Lua 5.1 参考手册

    Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingno ...

  8. [SQL]SQL语言入门级教材_SQL语法参考手册(三)

    SQL 语法参考手册 DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化.既易学又易懂的语法. 此语言几乎是每个资料库系统都必须提供 ...

  9. Lua参考手册

    英文原版: http://www.lua.org/manual/5.1/ 中文版下面2个地址都有:一样的 manual.luaer.cn lua在线手册 lua参考手册Lua参考手册的中文翻译(云风翻 ...

随机推荐

  1. 如何利用OCS存取PHP session全局变量

    如何利用OCS存取PHP session全局变量 阿里云技术团队:余汶龙   一.场景介绍 用户在利用PHP搭建网站时,会把一些信息存放在$_SESSION全局变量里,可以很方便的存取.在PHP的in ...

  2. TQ210开发板NFS挂载android4.0.4的rootfs的方法

    首先声明的是,我使用的u-boot是自己移植的u-boot2013.01.01而非天嵌官方的那个,至于使用官方的u-boot如何去实现nfs挂载rootfs我没怎么研究过,不过原理方法都是一致的. 主 ...

  3. 安装 vsftpd

    (1)安装vsftpdsudo apt-get install vsftpd (2)配置sudo vi /etc/vsftpd.conf #anonymous_enable=YESlocal_enab ...

  4. 利用spring自己实现观察者模式

    利用spring,自己实现的一个观察者模式,写着玩玩,目的是为了加深理解,下次用Spring自带的玩一玩. 首先我们定义一个侦听类接口 package com.hyenas.common.listen ...

  5. Linux 驱动分类 与访问技术

    驱动开发概述 1.驱动分类 1.1 常规分析法 1.1.1  字符设备  字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,  这样的驱动通常实现open, close, read和wri ...

  6. 主机、虚拟机、开发板(u-boot)之间的连接 - ping测试

    1.设置主机的IP地址(这里注意,设置一定要设置网线宽带IP,不要选成无线网络的) 查看重点是否本地以太网卡(Realtek PCIe……) 2.修改本地连接3个IP地址,一定主机.虚拟机.开发板 三 ...

  7. freeCodeCamp:Diff Two Arrays

    比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素.换言之,返回两个数组的差异. function diff(arr1, arr2) { var newArr = []; ...

  8. Windows命令行中使用SSH连接Linux

    转自 http://www.linuxidc.com/Linux/2014-02/96625.htm 1.下载: openssh for Winodws: 免费下载地址在 http://linux.l ...

  9. WebApi授权拦截——重写AuthorizeAttribute

        跟mvc一样,webapi大多通过附加Authorize特性来实现授权,Authorize当授权失败时返回状态码:401.一般系统状态为401时,服务端就Redirect重定向到登录页.   ...

  10. 初见,Devexpress

    [绥江一百]http://www.sj100.net                                                  欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...