diff --git a/Project.toml b/Project.toml index 8214ed08..4d8bb3d7 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "LLVM" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "9.4.0" +version = "9.4.1" [deps] CEnum = "fa961155-64e5-5f13-b03f-caf6b980ea82" @@ -19,7 +19,7 @@ BFloat16sExt = "BFloat16s" [compat] BFloat16s = "0.4, 0.5" CEnum = "0.2, 0.3, 0.4, 0.5" -LLVMExtra_jll = "=0.0.36" +LLVMExtra_jll = "=0.0.37" Libdl = "1.8" Preferences = "1.4" Printf = "1.8" diff --git a/deps/LLVMExtra/include/LLVMExtra.h b/deps/LLVMExtra/include/LLVMExtra.h index 42669bf0..2d1495e2 100644 --- a/deps/LLVMExtra/include/LLVMExtra.h +++ b/deps/LLVMExtra/include/LLVMExtra.h @@ -255,5 +255,8 @@ LLVMErrorRef LLVMRunJuliaPassesOnFunction(LLVMValueRef F, const char *Passes, LLVMPassBuilderOptionsRef Options, LLVMPassBuilderExtensionsRef Extensions); +// More DataLayout queries +unsigned LLVMGlobalsAddressSpace(LLVMTargetDataRef TD); + LLVM_C_EXTERN_C_END #endif diff --git a/deps/LLVMExtra/lib/Core.cpp b/deps/LLVMExtra/lib/Core.cpp index 519e2ff4..1d2311b7 100644 --- a/deps/LLVMExtra/lib/Core.cpp +++ b/deps/LLVMExtra/lib/Core.cpp @@ -780,6 +780,8 @@ void LLVMSetAtomicSyncScopeID(LLVMValueRef AtomicInst, unsigned SSID) { setAtomicSyncScopeID(I, SSID); } +#endif + // // more LLVMContextRef getters @@ -797,4 +799,11 @@ LLVMContextRef LLVMGetBuilderContext(LLVMBuilderRef Builder) { #endif -#endif + +// +// More DataLayout queries +// + +unsigned LLVMGlobalsAddressSpace(LLVMTargetDataRef TD) { + return unwrap(TD)->getDefaultGlobalsAddressSpace(); +} diff --git a/docs/src/lib/codegen.md b/docs/src/lib/codegen.md index ba091d55..92657476 100644 --- a/docs/src/lib/codegen.md +++ b/docs/src/lib/codegen.md @@ -38,6 +38,7 @@ dispose(::DataLayout) byteorder pointersize intptr +globals_addrspace sizeof(::DataLayout, ::LLVMType) storage_size abi_size diff --git a/docs/src/man/codegen.md b/docs/src/man/codegen.md index eac76265..c4519102 100644 --- a/docs/src/man/codegen.md +++ b/docs/src/man/codegen.md @@ -153,6 +153,7 @@ generating IR: - `byteorder` - `pointersize` - `intptr` +- `globals_addrspace` - `sizeof` - `storage_size` - `abi_alignment` diff --git a/lib/15/libLLVM_extra.jl b/lib/15/libLLVM_extra.jl index 831cf6c0..8a330824 100644 --- a/lib/15/libLLVM_extra.jl +++ b/lib/15/libLLVM_extra.jl @@ -401,3 +401,7 @@ function LLVMRunJuliaPassesOnFunction(F, Passes, TM, Options, Extensions) ccall((:LLVMRunJuliaPassesOnFunction, libLLVMExtra), LLVMErrorRef, (LLVMValueRef, Cstring, LLVMTargetMachineRef, LLVMPassBuilderOptionsRef, LLVMPassBuilderExtensionsRef), F, Passes, TM, Options, Extensions) end +function LLVMGlobalsAddressSpace(TD) + ccall((:LLVMGlobalsAddressSpace, libLLVMExtra), Cuint, (LLVMTargetDataRef,), TD) +end + diff --git a/lib/16/libLLVM_extra.jl b/lib/16/libLLVM_extra.jl index 831cf6c0..8a330824 100644 --- a/lib/16/libLLVM_extra.jl +++ b/lib/16/libLLVM_extra.jl @@ -401,3 +401,7 @@ function LLVMRunJuliaPassesOnFunction(F, Passes, TM, Options, Extensions) ccall((:LLVMRunJuliaPassesOnFunction, libLLVMExtra), LLVMErrorRef, (LLVMValueRef, Cstring, LLVMTargetMachineRef, LLVMPassBuilderOptionsRef, LLVMPassBuilderExtensionsRef), F, Passes, TM, Options, Extensions) end +function LLVMGlobalsAddressSpace(TD) + ccall((:LLVMGlobalsAddressSpace, libLLVMExtra), Cuint, (LLVMTargetDataRef,), TD) +end + diff --git a/lib/17/libLLVM_extra.jl b/lib/17/libLLVM_extra.jl index d0038676..b7ef156c 100644 --- a/lib/17/libLLVM_extra.jl +++ b/lib/17/libLLVM_extra.jl @@ -361,3 +361,7 @@ function LLVMRunJuliaPassesOnFunction(F, Passes, TM, Options, Extensions) ccall((:LLVMRunJuliaPassesOnFunction, libLLVMExtra), LLVMErrorRef, (LLVMValueRef, Cstring, LLVMTargetMachineRef, LLVMPassBuilderOptionsRef, LLVMPassBuilderExtensionsRef), F, Passes, TM, Options, Extensions) end +function LLVMGlobalsAddressSpace(TD) + ccall((:LLVMGlobalsAddressSpace, libLLVMExtra), Cuint, (LLVMTargetDataRef,), TD) +end + diff --git a/lib/18/libLLVM_extra.jl b/lib/18/libLLVM_extra.jl index 95298f76..0f7f3edf 100644 --- a/lib/18/libLLVM_extra.jl +++ b/lib/18/libLLVM_extra.jl @@ -295,3 +295,7 @@ function LLVMRunJuliaPassesOnFunction(F, Passes, TM, Options, Extensions) ccall((:LLVMRunJuliaPassesOnFunction, libLLVMExtra), LLVMErrorRef, (LLVMValueRef, Cstring, LLVMTargetMachineRef, LLVMPassBuilderOptionsRef, LLVMPassBuilderExtensionsRef), F, Passes, TM, Options, Extensions) end +function LLVMGlobalsAddressSpace(TD) + ccall((:LLVMGlobalsAddressSpace, libLLVMExtra), Cuint, (LLVMTargetDataRef,), TD) +end + diff --git a/lib/19/libLLVM_extra.jl b/lib/19/libLLVM_extra.jl index 95298f76..0f7f3edf 100644 --- a/lib/19/libLLVM_extra.jl +++ b/lib/19/libLLVM_extra.jl @@ -295,3 +295,7 @@ function LLVMRunJuliaPassesOnFunction(F, Passes, TM, Options, Extensions) ccall((:LLVMRunJuliaPassesOnFunction, libLLVMExtra), LLVMErrorRef, (LLVMValueRef, Cstring, LLVMTargetMachineRef, LLVMPassBuilderOptionsRef, LLVMPassBuilderExtensionsRef), F, Passes, TM, Options, Extensions) end +function LLVMGlobalsAddressSpace(TD) + ccall((:LLVMGlobalsAddressSpace, libLLVMExtra), Cuint, (LLVMTargetDataRef,), TD) +end + diff --git a/lib/20/libLLVM_extra.jl b/lib/20/libLLVM_extra.jl index 66245036..b9b25a7a 100644 --- a/lib/20/libLLVM_extra.jl +++ b/lib/20/libLLVM_extra.jl @@ -247,3 +247,7 @@ function LLVMRunJuliaPassesOnFunction(F, Passes, TM, Options, Extensions) ccall((:LLVMRunJuliaPassesOnFunction, libLLVMExtra), LLVMErrorRef, (LLVMValueRef, Cstring, LLVMTargetMachineRef, LLVMPassBuilderOptionsRef, LLVMPassBuilderExtensionsRef), F, Passes, TM, Options, Extensions) end +function LLVMGlobalsAddressSpace(TD) + ccall((:LLVMGlobalsAddressSpace, libLLVMExtra), Cuint, (LLVMTargetDataRef,), TD) +end + diff --git a/src/datalayout.jl b/src/datalayout.jl index 731a6fb9..dc8a93fa 100644 --- a/src/datalayout.jl +++ b/src/datalayout.jl @@ -1,7 +1,7 @@ ## data layout export DataLayout, dispose, - byteorder, pointersize, intptr, + byteorder, pointersize, intptr, globals_addrspace, sizeof, storage_size, abi_size, abi_alignment, frame_alignment, preferred_alignment, element_at, offsetof @@ -38,119 +38,126 @@ This object needs to be disposed of using [`dispose`](@ref). DataLayout(tm::TargetMachine) = mark_alloc(DataLayout(API.LLVMCreateTargetDataLayout(tm))) """ - dispose(data::DataLayout) + dispose(dl::DataLayout) Dispose of the given target data layout. """ -dispose(data::DataLayout) = mark_dispose(API.LLVMDisposeTargetData, data) +dispose(dl::DataLayout) = mark_dispose(API.LLVMDisposeTargetData, dl) function DataLayout(f::Core.Function, args...; kwargs...) - data = DataLayout(args...; kwargs...) + dl = DataLayout(args...; kwargs...) try - f(data) + f(dl) finally - dispose(data) + dispose(dl) end end -Base.string(data::DataLayout) = - unsafe_message(API.LLVMCopyStringRepOfTargetData(data)) +Base.string(dl::DataLayout) = + unsafe_message(API.LLVMCopyStringRepOfTargetData(dl)) -function Base.show(io::IO, data::DataLayout) - @printf(io, "DataLayout(%s)", string(data)) +function Base.show(io::IO, dl::DataLayout) + @printf(io, "DataLayout(%s)", string(dl)) end """ - byteorder(data::DataLayout) + byteorder(dl::DataLayout) Get the byte order of the target data layout. """ -byteorder(data::DataLayout) = API.LLVMByteOrder(data) +byteorder(dl::DataLayout) = API.LLVMByteOrder(dl) """ - pointersize(data::DataLayout, [addrspace::Integer]) + pointersize(dl::DataLayout, [addrspace::Integer]) Get the pointer size of the target data layout. """ -pointersize(data::DataLayout, addrspace::Integer=0) = - API.LLVMPointerSizeForAS(data, addrspace) +pointersize(dl::DataLayout, addrspace::Integer=0) = + API.LLVMPointerSizeForAS(dl, addrspace) """ - intptr(data::DataLayout, [addrspace::Integer]) + intptr(dl::DataLayout, [addrspace::Integer]) Get the integer type that is the same size as a pointer for the target data layout. """ -intptr(data::DataLayout, addrspace::Integer=0) = - IntegerType(API.LLVMIntPtrTypeForASInContext(context(), data, addrspace)) +intptr(dl::DataLayout, addrspace::Integer=0) = + IntegerType(API.LLVMIntPtrTypeForASInContext(context(), dl, addrspace)) """ - sizeof(data::DataLayout, typ::LLVMType) + globals_addrspace(dl::DataLayout) + +Get the address space used for global variables in the target data layout. +""" +globals_addrspace(dl::DataLayout) = API.LLVMGlobalsAddressSpace(dl) |> Int + +""" + sizeof(dl::DataLayout, typ::LLVMType) Get the size of the given type in bytes for the target data layout. """ -Base.sizeof(data::DataLayout, typ::LLVMType) = Int(API.LLVMSizeOfTypeInBits(data, typ) / 8) +Base.sizeof(dl::DataLayout, typ::LLVMType) = Int(API.LLVMSizeOfTypeInBits(dl, typ) / 8) """ - storage_size(data::DataLayout, typ::LLVMType) + storage_size(dl::DataLayout, typ::LLVMType) Get the storage size of the given type in bytes for the target data layout. """ -storage_size(data::DataLayout, typ::LLVMType) = API.LLVMStoreSizeOfType(data, typ) +storage_size(dl::DataLayout, typ::LLVMType) = API.LLVMStoreSizeOfType(dl, typ) """ - abi_size(data::DataLayout, typ::LLVMType) + abi_size(dl::DataLayout, typ::LLVMType) Get the ABI size of the given type in bytes for the target data layout. """ -abi_size(data::DataLayout, typ::LLVMType) = API.LLVMABISizeOfType(data, typ) +abi_size(dl::DataLayout, typ::LLVMType) = API.LLVMABISizeOfType(dl, typ) """ - abi_alignment(data::DataLayout, typ::LLVMType) + abi_alignment(dl::DataLayout, typ::LLVMType) Get the ABI alignment of the given type in bytes for the target data layout. """ -abi_alignment(data::DataLayout, typ::LLVMType) = - API.LLVMABIAlignmentOfType(data, typ) +abi_alignment(dl::DataLayout, typ::LLVMType) = + API.LLVMABIAlignmentOfType(dl, typ) """ - frame_alignment(data::DataLayout, typ::LLVMType) + frame_alignment(dl::DataLayout, typ::LLVMType) Get the call frame alignment of the given type in bytes for the target data layout. """ -frame_alignment(data::DataLayout, typ::LLVMType) = - API.LLVMCallFrameAlignmentOfType(data, typ) +frame_alignment(dl::DataLayout, typ::LLVMType) = + API.LLVMCallFrameAlignmentOfType(dl, typ) """ - preferred_alignment(data::DataLayout, typ::LLVMType) - preferred_alignment(data::DataLayout, var::GlobalVariable) + preferred_alignment(dl::DataLayout, typ::LLVMType) + preferred_alignment(dl::DataLayout, var::GlobalVariable) Get the preferred alignment of the given type or global variable in bytes for the target data layout. """ preferred_alignment(::DataLayout, ::Union{LLVMType, GlobalVariable}) -preferred_alignment(data::DataLayout, typ::LLVMType) = - API.LLVMPreferredAlignmentOfType(data, typ) -preferred_alignment(data::DataLayout, var::GlobalVariable) = - API.LLVMPreferredAlignmentOfGlobal(data, var) +preferred_alignment(dl::DataLayout, typ::LLVMType) = + API.LLVMPreferredAlignmentOfType(dl, typ) +preferred_alignment(dl::DataLayout, var::GlobalVariable) = + API.LLVMPreferredAlignmentOfGlobal(dl, var) """ - element_at(data::DataLayout, typ::StructType, offset::Integer) + element_at(dl::DataLayout, typ::StructType, offset::Integer) Get the element at the given offset in a struct type for the target data layout. See also: [`offsetof`](@ref). """ -element_at(data::DataLayout, typ::StructType, offset::Integer) = - API.LLVMElementAtOffset(data, typ, Culonglong(offset)) +element_at(dl::DataLayout, typ::StructType, offset::Integer) = + API.LLVMElementAtOffset(dl, typ, Culonglong(offset)) """ - offsetof(data::DataLayout, typ::StructType, element::Integer) + offsetof(dl::DataLayout, typ::StructType, element::Integer) Get the offset of the given element in a struct type for the target data layout. See also: [`element_at`](@ref). """ -offsetof(data::DataLayout, typ::StructType, element::Integer) = - API.LLVMOffsetOfElement(data, typ, element) +offsetof(dl::DataLayout, typ::StructType, element::Integer) = + API.LLVMOffsetOfElement(dl, typ, element) diff --git a/src/irbuilder.jl b/src/irbuilder.jl index 134c3461..c236f22c 100644 --- a/src/irbuilder.jl +++ b/src/irbuilder.jl @@ -523,14 +523,15 @@ not!(builder::IRBuilder, V::Value, Name::String="") = # re-implementation for flexibility (exposing addrspace, add_null) function globalstring!(mod::LLVM.Module, str::String, name::String=""; - addrspace::Integer=0, add_null::Bool=true) + addrspace::Union{Integer,Nothing}=nothing, add_null::Bool=true) bytes = Vector{UInt8}(str) if add_null push!(bytes, 0x00) end constant = ConstantDataArray(bytes) - gv = GlobalVariable(mod, value_type(constant), name, addrspace) + gv = GlobalVariable(mod, value_type(constant), name, + something(addrspace, globals_addrspace(datalayout(mod)))) alignment!(gv, 1) unnamed_addr!(gv, true) initializer!(gv, constant) diff --git a/test/datalayout_tests.jl b/test/datalayout_tests.jl index 112209e0..ae1bab35 100644 --- a/test/datalayout_tests.jl +++ b/test/datalayout_tests.jl @@ -3,39 +3,44 @@ dlstr = "E-p:32:32-f128:128:128" let - data = DataLayout(dlstr) - dispose(data) + dl = DataLayout(dlstr) + dispose(dl) end -DataLayout(dlstr) do data +DataLayout(dlstr) do dl end -@dispose ctx=Context() data=DataLayout(dlstr) begin - @test string(data) == dlstr +@dispose ctx=Context() dl=DataLayout(dlstr) begin + @test string(dl) == dlstr - @test occursin(dlstr, sprint(io->show(io,data))) + @test occursin(dlstr, sprint(io->show(io,dl))) - @test byteorder(data) == LLVM.API.LLVMBigEndian - @test pointersize(data) == pointersize(data, 0) == 4 + @test byteorder(dl) == LLVM.API.LLVMBigEndian + @test pointersize(dl) == pointersize(dl, 0) == 4 - @test intptr(data) == intptr(data, 0) == LLVM.Int32Type() + @test intptr(dl) == intptr(dl, 0) == LLVM.Int32Type() - @test sizeof(data, LLVM.Int32Type()) == storage_size(data, LLVM.Int32Type()) == abi_size(data, LLVM.Int32Type()) == 4 + @test sizeof(dl, LLVM.Int32Type()) == storage_size(dl, LLVM.Int32Type()) == abi_size(dl, LLVM.Int32Type()) == 4 - @test abi_alignment(data, LLVM.Int32Type()) == frame_alignment(data, LLVM.Int32Type()) == preferred_alignment(data, LLVM.Int32Type()) == 4 + @test abi_alignment(dl, LLVM.Int32Type()) == frame_alignment(dl, LLVM.Int32Type()) == preferred_alignment(dl, LLVM.Int32Type()) == 4 @dispose mod=LLVM.Module("SomeModule") begin gv = GlobalVariable(mod, LLVM.Int32Type(), "SomeGlobal") - @test preferred_alignment(data, gv) == 4 + @test preferred_alignment(dl, gv) == 4 - datalayout!(mod, data) - @test string(datalayout(mod)) == string(data) + datalayout!(mod, dl) + @test string(datalayout(mod)) == string(dl) end elem = [LLVM.Int32Type(), LLVM.FloatType()] let st = LLVM.StructType(elem) - @test element_at(data, st, 4) == 1 - @test offsetof(data, st, 1) == 4 + @test element_at(dl, st, 4) == 1 + @test offsetof(dl, st, 1) == 4 + end + + @test globals_addrspace(dl) == 0 + @dispose dl2=DataLayout(dlstr*"-G1") begin + @test globals_addrspace(dl2) == 1 end end