Skip to content

Commit 9ab6adc

Browse files
committed
Add imaging_mode support (static compilation)
1 parent 1e58c56 commit 9ab6adc

File tree

9 files changed

+25
-17
lines changed

9 files changed

+25
-17
lines changed

src/driver.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ function compile(target::Symbol, @nospecialize(job::CompilerJob);
3838

3939
return codegen(target, job;
4040
libraries=libraries, deferred_codegen=deferred_codegen,
41-
optimize=optimize, strip=strip, validate=validate, only_entry=only_entry)
41+
optimize=optimize, strip=strip, validate=validate,
42+
only_entry=only_entry)
4243
end
4344

4445
# primitive mechanism for deferred compilation, for implementing CUDA dynamic parallelism.

src/gcn.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ end
1010

1111
llvm_triple(::GCNCompilerTarget) = "amdgcn-amd-amdhsa"
1212

13-
function llvm_machine(target::GCNCompilerTarget)
13+
function llvm_machine(target::GCNCompilerTarget, static)
1414
triple = llvm_triple(target)
1515
t = Target(triple=triple)
1616

@@ -65,7 +65,7 @@ function optimize_module!(job::CompilerJob{GCNCompilerTarget}, mod::LLVM.Module)
6565
triple!(mod, llvm_triple(job.target))
6666
datalayout!(mod, llvm_datalayout(job.target))
6767

68-
tm = llvm_machine(job.target)
68+
tm = llvm_machine(job.target, job.source.static)
6969
ModulePassManager() do pm
7070
add_library_info!(pm, triple(mod))
7171
add_transform_info!(pm, tm)

src/interface.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,19 @@ source_code(::AbstractCompilerTarget) = "text"
2323

2424
llvm_triple(::AbstractCompilerTarget) = error("Not implemented")
2525

26-
function llvm_machine(target::AbstractCompilerTarget)
26+
function llvm_machine(target::AbstractCompilerTarget, static)
2727
triple = llvm_triple(target)
2828

2929
t = Target(triple=triple)
3030

31-
tm = TargetMachine(t, triple)
31+
reloc = static ? LLVM.API.LLVMRelocPIC : LLVM.API.LLVMRelocDefault
32+
tm = TargetMachine(t, triple, "", "", LLVM.API.LLVMCodeGenLevelDefault, reloc)
3233
asm_verbosity!(tm, true)
3334

3435
return tm
3536
end
3637

37-
llvm_datalayout(target::AbstractCompilerTarget) = DataLayout(llvm_machine(target))
38+
llvm_datalayout(target::AbstractCompilerTarget) = DataLayout(llvm_machine(target, false))
3839

3940

4041
## params
@@ -57,12 +58,13 @@ struct FunctionSpec{F,TT}
5758
tt::DataType
5859
kernel::Bool
5960
name::Union{Nothing,String}
61+
static::Bool
6062
end
6163

6264
# put the function and argument types in typevars
6365
# so that we can access it from generated functions
64-
FunctionSpec(f, tt=Tuple{}, kernel=true, name=nothing) =
65-
FunctionSpec{typeof(f),tt}(f, tt, kernel, name)
66+
FunctionSpec(f, tt=Tuple{}, kernel=true, name=nothing, static=false) =
67+
FunctionSpec{typeof(f),tt}(f, tt, kernel, name, static)
6668

6769
function signature(spec::FunctionSpec)
6870
fn = something(spec.name, nameof(spec.f))

src/jlgen.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,10 @@ function compile_method_instance(@nospecialize(job::CompilerJob), method_instanc
214214
end
215215

216216
# generate IR
217+
extern_policy = job.source.static ? 2 : 1
217218
native_code = ccall(:jl_create_native, Ptr{Cvoid},
218219
(Vector{MethodInstance}, Base.CodegenParams, Cint),
219-
[method_instance], params, #=extern policy=# 1)
220+
[method_instance], params, extern_policy)
220221
@assert native_code != C_NULL
221222
llvm_mod_ref = ccall(:jl_get_llvm_module, LLVM.API.LLVMModuleRef,
222223
(Ptr{Cvoid},), native_code)

src/mcgen.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ end
6969

7070

7171
function mcgen(@nospecialize(job::CompilerJob), mod::LLVM.Module, f::LLVM.Function, format=LLVM.API.LLVMAssemblyFile)
72-
tm = llvm_machine(job.target)
72+
tm = llvm_machine(job.target, job.source.static)
7373

7474
return String(emit(tm, mod, format))
7575
end

src/native.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ end
1111

1212
llvm_triple(::NativeCompilerTarget) = Sys.MACHINE
1313

14-
function llvm_machine(target::NativeCompilerTarget)
14+
function llvm_machine(target::NativeCompilerTarget, static)
1515
triple = llvm_triple(target)
1616

1717
t = Target(triple=triple)
1818

19-
tm = TargetMachine(t, triple, target.cpu, target.features)
19+
optlevel = LLVM.API.LLVMCodeGenLevelDefault
20+
reloc = static ? LLVM.API.LLVMRelocPIC : LLVM.API.LLVMRelocDefault
21+
tm = TargetMachine(t, triple, target.cpu, target.features, optlevel, reloc)
2022
asm_verbosity!(tm, true)
2123

2224
return tm

src/optim.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# LLVM IR optimization
22

33
function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module)
4-
tm = llvm_machine(job.target)
4+
tm = llvm_machine(job.target, job.source.static)
55

66
function initialize!(pm)
77
add_library_info!(pm, triple(mod))

src/ptx.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ source_code(::PTXCompilerTarget) = "ptx"
1818

1919
llvm_triple(::PTXCompilerTarget) = Int===Int64 ? "nvptx64-nvidia-cuda" : "nvptx-nvidia-cuda"
2020

21-
function llvm_machine(target::PTXCompilerTarget)
21+
function llvm_machine(target::PTXCompilerTarget, static)
2222
triple = llvm_triple(target)
2323
t = Target(triple=triple)
2424

2525
cpu = "sm_$(target.cap.major)$(target.cap.minor)"
2626
feat = "+ptx60" # we only support CUDA 9.0+ and LLVM 6.0+
27-
tm = TargetMachine(t, triple, cpu, feat)
27+
optlevel = LLVM.API.LLVMCodeGenLevelDefault
28+
reloc = static ? LLVM.API.LLVMRelocPIC : LLVM.API.LLVMRelocDefault
29+
tm = TargetMachine(t, triple, cpu, feat, optlevel, reloc)
2830
asm_verbosity!(tm, true)
2931

3032
return tm
@@ -127,7 +129,7 @@ function add_lowering_passes!(job::CompilerJob{PTXCompilerTarget}, pm::LLVM.Pass
127129
end
128130

129131
function optimize_module!(job::CompilerJob{PTXCompilerTarget}, mod::LLVM.Module)
130-
tm = llvm_machine(job.target)
132+
tm = llvm_machine(job.target, job.source.static)
131133
ModulePassManager() do pm
132134
add_library_info!(pm, triple(mod))
133135
add_transform_info!(pm, tm)

src/spirv.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ end
1818
llvm_triple(::SPIRVCompilerTarget) = Int===Int64 ? "spir64-unknown-unknown" : "spirv-unknown-unknown"
1919

2020
# SPIRV is not supported by our LLVM builds, so we can't get a target machine
21-
llvm_machine(::SPIRVCompilerTarget) = nothing
21+
llvm_machine(::SPIRVCompilerTarget, static) = nothing
2222

2323
llvm_datalayout(::SPIRVCompilerTarget) = Int===Int64 ?
2424
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" :

0 commit comments

Comments
 (0)