全部全局變量和函數具備如下的可見性模式之一:html
全部全局變量,函數,別名(Aliases)能夠擁有下面的DLL存儲類別之一:python
LLVM IR容許你爲明確類型標識其名稱的別名。這使得閱讀IR更加得容易且使IR更加緊湊(condensed )(實際上這與遞歸類型有關)。一個名字標識的例子以下:windows
%mytype = type { %mytype*, i32 }
你能夠給定對除了「void」任何類型一個名稱。類型名的別名能夠被使用到任何指望 「%mytype」語法的地方。數組
注意,這些類型名是構造類型指明的名稱的別名,所以你能夠對同一個類型標識多個名字。這一般會在dumping out一個 .ll文件的時候致使行爲混亂。因爲LLVM IR使用構造類型,因此這個名稱不是這個類型的一部分。當print out LLVM IR,printer會挑選一個名稱替代來同一類型的全部名稱(the printer will pick one name to render all types of a particular shape. 。。。爲相同形狀着色,囧)。這意味着若是你有最終具備相同LLVM 類型的兩個不一樣的源類型在一段代碼中,那麼dumper會打印the 「wrong」 或 unexpected type。這是一個重要的設計點且將不會被改變。函數
全局變量在編譯期定義存儲分配範圍而不是運行期。優化
全局變量定義必須被初始化,被放置在一個顯式的section中,且有一個可選的顯式對齊標識。spa
全局變量在其餘的編譯單元也能夠被聲明,但在這種狀況下它們沒有初始化式(initializer)。線程
一個變量可能被定義爲thread_local,,這意味着這個變量不會被其餘線程所共享(每個線程會擁有這個變量的一份單獨的拷貝)。設計
不是全部平臺都支持thread-local變量。可選地,一個TLS模型能夠標識:指針
localdynamic
標識僅用於當前可共享庫的變量
initialexec
標識在模塊中不會被動態加載的變量
localexec
標識在可執行程序中定義且只在可執行程序中使用的變量
默認下,全局初始化式經過假設被定義在模塊中的全局變量是在全局初始化式以前他們的初始值是不會被修改的。對於可能從外部被訪問的變量,包括帶有「external」連接標識的全局變量 或者 出如今@llvm.used 或者 dll導出的變量,這種猜測也是正確的。這種猜測會被帶有"externally_initialized"的變量抑制。
一個顯式對齊可能被標識於一個全局變量,這個顯示對齊必定是2的次冪。若是對齊屬性標識不存在,或者對齊屬性被設置爲0,那麼這個全局變量的對齊屬性將會被根據目標平臺需求設置。若是一個顯式的對齊屬性被標識,這個全局變量被迫徹底按照這個對齊屬性對齊。若是這個全局變量有一個被分配到的section,目標平臺和優化器不會容許over-align這個全局變量。在這種狀況下,額外的對齊是顯而易見的:例如,代碼可能猜測全局變量被集中放置到他們的section中並嘗試以數組形式遍歷他們,但對齊填充會打破這個遍歷過程。
全局變量一樣能夠擁有一個DLL存儲類別
語法:
[@<GlobalVarName> =] [Linkage] [Visibility] [DLLStorageClass] [ThreadLocal]
[AddrSpace] [unnamed_addr] [ExternallyInitialized]
<global | constant> <Type>
[, section "name"] [, align <Alignment>]
例如,下面定義了一個存儲在編號地址帶有一個初始化式,section和對齊屬性的全局常量。
@G = addrspace(5) constant float 1.0, section "foo", align 4
下面是一個只聲明全局變量的例子
@G = external global i32
下面是一個定義了thread-local的帶有initialexec TLS模型的全局變量
@G = thread_local(initialexec) global i32 0, align 4