1 use crate::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, Target, TargetOptions};
3 pub fn target() -> Target {
5 arch: "nvptx64".into(),
6 data_layout: "e-i64:64-i128:128-v16:16-v32:32-n16:32:64".into(),
7 llvm_target: "nvptx64-nvidia-cuda".into(),
10 options: TargetOptions {
12 vendor: "nvidia".into(),
13 linker_flavor: LinkerFlavor::PtxLinker,
14 // The linker can be installed from `crates.io`.
15 linker: Some("rust-ptx-linker".into()),
18 // With `ptx-linker` approach, it can be later overridden via link flags.
21 // FIXME: create tests for the atomics.
22 max_atomic_width: Some(64),
24 // Unwinding on CUDA is neither feasible nor useful.
25 panic_strategy: PanicStrategy::Abort,
27 // Needed to use `dylib` and `bin` crate types and the linker.
28 dynamic_linking: true,
30 // Avoid using dylib because it contain metadata not supported
31 // by LLVM NVPTX backend.
34 // Let the `ptx-linker` to handle LLVM lowering into MC / assembly.
37 // Convenient and predicable naming scheme.
38 dll_prefix: "".into(),
39 dll_suffix: ".ptx".into(),
40 exe_suffix: ".ptx".into(),
42 // Disable MergeFunctions LLVM optimisation pass because it can
43 // produce kernel functions that call other kernel functions.
44 // This behavior is not supported by PTX ISA.
45 merge_functions: MergeFunctions::Disabled,
47 // The LLVM backend does not support stack canaries for this target
48 supports_stack_protector: false,