LLVM学习笔记⑥

函数
LLVM函数定义包括" define "关键字,一个可选的链接类型,一个可选的运行时抢占说明符,一个可选的可见性样式,一个可选的DLL存储类,一个可选的调用约定,一个可选的unnamed_addr属性,一个返回类型,一个可选的返回类型的参数属性,函数名,一个(可能是空的)参数列表(每个参数都有可选的属性),可选的函数属性,可选的地址空间,可选的section,可选的alignment,可选的comdat,可选的垃圾收集器名称,可选的前缀,可选的序言,可选的个性,可选的附加元数据列表,一个左花括号,一个基本块列表,一个右花括号。
LLVM函数声明包括“声明”关键字,一个可选的链接类型,一个可选的可见性风格,一个可选的DLL存储类,一个可选的调用协定,一个可选的unnamed_addr或local_unnamed_addr属性,一个可选的地址空间,一个返回类型,返回类型的一个可选参数属性,函数名,一个可能为空的参数列表、一个可选的对齐、一个可选的垃圾收集器名称、一个可选的前缀和一个可选的序言
一个函数定义包含一个基本块列表,形成该函数的CFG(控制流图)。每个基本块可以有选择地以一个标签开始(赋予基本块一个符号表入口),包含一个指令列表,并以终止指令(如分支或函数返回)结束。如果未提供显式标签,则给块赋值一个隐含的编号标签,编号使用从计数器中返回下一个值,就像用于未命名的临时对象那样(参见上文)。例如,如果函数入口块没有明确的标签,则会分配标签“%0”,那么该块中的第一个未命名的临时块将为“%1”,以此类推。如果显式指定了数字标签,则它必须与将要隐式使用的数字标签相匹配。
函数中的第一个基本块在两方面都很特殊:它在函数入口时立即执行,并且它不允许有祖先基本块(即不能有任何分支到函数入口块)。因为block可以没有前辈,所以它也不能有任何PHI节点。
LLVM允许显式地为函数指定section。如果目标支持它,它将向指定的section发出函数。此外,该函数可以放在一个COMDAT中。
可以为函数指定显式对齐。如果不存在,或者对齐设置为0,则目标将函数的对齐设置为任何它觉得方便的位置。如果指定了显式对齐,函数将被迫至少有这么多对齐。所有的排列必须是2的幂。
如果指定了unnamed_addr属性,则知道地址不重要,可以合并两个相同的函数。
如果给定了local_unnamed_addr属性,则知道该地址在模块中不重要。
如果没有给出明确的地址空间,它将默认为datalayout字符串中的程序地址空间。
语法

define [linkage] [PreemptionSpecifier] [visibility] [DLLStorageClass]
       [cconv] [ret attrs]
        @ ([argument list])
       [(unnamed_addr|local_unnamed_addr)] [AddrSpace] [fn Attrs]
       [section "name"] [comdat [($name)]] [align N] [gc] [prefix Constant]
       [prologue Constant] [personality Constant] (!name !N)* { ... }

参数列表是一个逗号分隔的参数序列,其中每个参数的形式如下:

 [parameter Attrs] [name]

你可能感兴趣的:(LLVM,llvm)