Skip to content

Commit

Permalink
[SOL] Split SBPF targets (#117)
Browse files Browse the repository at this point in the history
  • Loading branch information
LucasSte authored Feb 14, 2025
1 parent e5554d1 commit 08b7341
Show file tree
Hide file tree
Showing 19 changed files with 172 additions and 55 deletions.
19 changes: 13 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,19 @@ jobs:
tidy: false
os: ubuntu-latest
env: {}
- name: sbf-solana-solana-v1
- name: sbpf-solana-solana
tidy: false
os: ubuntu-latest
env: {}
- name: sbf-solana-solana-v2
- name: sbpfv1-solana-solana
tidy: false
os: ubuntu-latest
env: {}
- name: sbf-solana-solana-v3
- name: sbpfv2-solana-solana
tidy: false
os: ubuntu-latest
env: {}
- name: sbpfv3-solana-solana
tidy: false
os: ubuntu-latest
env: {}
Expand Down Expand Up @@ -211,13 +215,16 @@ jobs:
- name: sbf-solana-solana
os: ubuntu-latest
env: {}
- name: sbf-solana-solana-v1
- name: sbpf-solana-solana
os: ubuntu-latest
env: {}
- name: sbpfv1-solana-solana
os: ubuntu-latest
env: {}
- name: sbf-solana-solana-v2
- name: sbpfv2-solana-solana
os: ubuntu-latest
env: {}
- name: sbf-solana-solana-v3
- name: sbpfv3-solana-solana
os: ubuntu-latest
env: {}
defaults:
Expand Down
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ esac
if [ "$1" == "--llvm" ]; then
rm -f build/${HOST_TRIPLE}/llvm/llvm-finished-building;
fi
./x.py build --stage 1 --target ${HOST_TRIPLE},sbf-solana-solana
./x.py build --stage 1 --target ${HOST_TRIPLE},sbf-solana-solana,sbpf-solana-solana,sbpfv1-solana-solana,sbpfv2-solana-solana,sbpfv3-solana-solana
8 changes: 0 additions & 8 deletions compiler/rustc_codegen_ssa/src/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1887,14 +1887,6 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty

let path = tmpdir.join(file_name);

let script = if sess.target.arch == "sbf" &&
sess.opts.cg.target_cpu.as_ref()
.unwrap_or(&sess.target.cpu.as_ref().to_string()) == "v3" {
&sess.target.sbf_v3_link_script.as_ref().unwrap()
} else {
script
};

if let Err(error) = fs::write(&path, script.as_ref()) {
sess.dcx().emit_fatal(errors::LinkScriptWriteFailure { path, error });
}
Expand Down
45 changes: 40 additions & 5 deletions compiler/rustc_target/src/spec/base/sbf_base.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::abi::Endian;
use crate::spec::{Cc, cvs, LinkerFlavor, Lld, PanicStrategy, TargetOptions};
use crate::spec::{Cc, cvs, LinkerFlavor, Lld, PanicStrategy, Target, TargetOptions};

const V0_LINKER_SCRIPT: &str = r"
PHDRS
Expand Down Expand Up @@ -81,12 +81,31 @@ PHDRS
}
";

pub fn opts() -> TargetOptions {
pub fn opts(version: &'static str) -> TargetOptions {
let pre_link_args = TargetOptions::link_args(
LinkerFlavor::Gnu(Cc::No, Lld::No),
&["--threads=1", "-z", "notext", "--Bdynamic"],
);

let linker_script = if version == "v3" {
V3_LINKER_SCRIPT
} else {
V0_LINKER_SCRIPT
};
let cpu = if version == "v0" {
"generic"
} else {
version
};

let features = if version == "v3" {
"+static-syscalls"
} else if version == "v0" {
"+store-imm,+jmp-ext"
} else {
""
};

TargetOptions {
allow_asm: true,
c_int_width: "64".into(),
Expand All @@ -99,8 +118,7 @@ pub fn opts() -> TargetOptions {
env: "".into(),
executables: true,
families: cvs!["solana"],
features: "+store-imm,+jmp-ext".into(),
link_script: Some(V0_LINKER_SCRIPT.into()),
link_script: Some(linker_script.into()),
linker: Some("rust-lld".into()),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
main_needs_argc_argv: false,
Expand All @@ -115,7 +133,24 @@ pub fn opts() -> TargetOptions {
singlethread: true,
vendor: "solana".into(),
c_enum_min_bits: Some(32),
sbf_v3_link_script: Some(V3_LINKER_SCRIPT.into()),
cpu: cpu.into(),
features: features.into(),
.. Default::default()
}
}

pub fn sbf_target(version: &'static str) -> Target {
Target {
llvm_target: "sbf".into(),
pointer_width: 64,
arch: "sbf".into(),
data_layout: "e-m:e-p:64:64-i64:64-n32:64-S128".into(),
options: opts(version),
metadata: crate::spec::TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
}
}
11 changes: 5 additions & 6 deletions compiler/rustc_target/src/spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,11 @@ supported_targets! {
("bpfeb-unknown-none", bpfeb_unknown_none),
("bpfel-unknown-none", bpfel_unknown_none),
("sbf-solana-solana", sbf_solana_solana),
("sbpf-solana-solana", sbpf_solana_solana),
("sbpfv1-solana-solana", sbpfv1_solana_solana),
("sbpfv2-solana-solana", sbpfv2_solana_solana),
("sbpfv3-solana-solana", sbpfv3_solana_solana),


("armv6k-nintendo-3ds", armv6k_nintendo_3ds),

Expand Down Expand Up @@ -2307,9 +2312,6 @@ pub struct TargetOptions {

/// Whether the target supports XRay instrumentation.
pub supports_xray: bool,

/// SBFv3 linker script
pub sbf_v3_link_script: Option<StaticCow<str>>,
}

/// Add arguments for the given flavor and also for its "twin" flavors
Expand Down Expand Up @@ -2527,7 +2529,6 @@ impl Default for TargetOptions {
entry_name: "main".into(),
entry_abi: Conv::C,
supports_xray: false,
sbf_v3_link_script: None,
}
}
}
Expand Down Expand Up @@ -3259,7 +3260,6 @@ impl Target {
key!(entry_name);
key!(entry_abi, Conv)?;
key!(supports_xray, bool);
key!(sbf_v3_link_script, optional);

if base.is_builtin {
// This can cause unfortunate ICEs later down the line.
Expand Down Expand Up @@ -3517,7 +3517,6 @@ impl ToJson for Target {
target_option_val!(entry_name);
target_option_val!(entry_abi);
target_option_val!(supports_xray);
target_option_val!(sbf_v3_link_script);

// Serializing `-Clink-self-contained` needs a dynamic key to support the
// backwards-compatible variants.
Expand Down
14 changes: 1 addition & 13 deletions compiler/rustc_target/src/spec/targets/sbf_solana_solana.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,5 @@ use crate::spec::Target;
use crate::spec::base::sbf_base;

pub fn target() -> Target {
Target {
llvm_target: "sbf".into(),
pointer_width: 64,
arch: "sbf".into(),
data_layout: "e-m:e-p:64:64-i64:64-n32:64-S128".into(),
options: sbf_base::opts(),
metadata: crate::spec::TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
}
sbf_base::sbf_target("v0")
}
6 changes: 6 additions & 0 deletions compiler/rustc_target/src/spec/targets/sbpf_solana_solana.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use crate::spec::Target;
use crate::spec::base::sbf_base;

pub fn target() -> Target {
sbf_base::sbf_target("v0")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use crate::spec::Target;
use crate::spec::base::sbf_base;

pub fn target() -> Target {
sbf_base::sbf_target("v1")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use crate::spec::Target;
use crate::spec::base::sbf_base;

pub fn target() -> Target {
sbf_base::sbf_target("v2")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use crate::spec::Target;
use crate::spec::base::sbf_base;

pub fn target() -> Target {
sbf_base::sbf_target("v3")
}
6 changes: 5 additions & 1 deletion src/bootstrap/src/utils/cc_detect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,11 @@ fn default_compiler(
}
}

"sbf-solana-solana" => {
"sbf-solana-solana"
| "sbpf-solana-solana"
| "sbpfv1-solana-solana"
| "sbpfv2-solana-solana"
| "sbpfv3-solana-solana" => {
Some(build.llvm_bin(target).join(compiler.clang()))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,8 @@ ENV RUST_CONFIGURE_ARGS \
--set rust.lld \
--set llvm.clang

ENV SCRIPT CARGO_TARGET_SBF_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
CARGO_TARGET_SBF_SOLANA_SOLANA_RUSTFLAGS=\"-C target_cpu=v1\" \
ENV SCRIPT CARGO_TARGET_SBPF_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
LLVM_HOME=/checkout/obj/build/x86_64-unknown-linux-gnu/llvm \
PATH="${HOME}/.cargo/bin:${PATH}" \
python3 /checkout/x.py --stage 1 test --host='' --target sbf-solana-solana \
python3 /checkout/x.py --stage 1 test --host='' --target sbpf-solana-solana \
library/core
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,8 @@ ENV RUST_CONFIGURE_ARGS \
--set rust.lld \
--set llvm.clang

ENV SCRIPT CARGO_TARGET_SBF_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
CARGO_TARGET_SBF_SOLANA_SOLANA_RUSTFLAGS=\"-C target_cpu=v2\" \
ENV SCRIPT CARGO_TARGET_SBPFV1_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
LLVM_HOME=/checkout/obj/build/x86_64-unknown-linux-gnu/llvm \
PATH="${HOME}/.cargo/bin:${PATH}" \
python3 /checkout/x.py --stage 1 test --host='' --target sbf-solana-solana \
python3 /checkout/x.py --stage 1 test --host='' --target sbpfv1-solana-solana \
library/core
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,8 @@ ENV RUST_CONFIGURE_ARGS \
--set rust.lld \
--set llvm.clang

ENV SCRIPT CARGO_TARGET_SBF_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
CARGO_TARGET_SBF_SOLANA_SOLANA_RUSTFLAGS=\"-C target_cpu=v3\" \
ENV SCRIPT CARGO_TARGET_SBPFV2_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
LLVM_HOME=/checkout/obj/build/x86_64-unknown-linux-gnu/llvm \
PATH="${HOME}/.cargo/bin:${PATH}" \
python3 /checkout/x.py --stage 1 test --host='' --target sbf-solana-solana \
python3 /checkout/x.py --stage 1 test --host='' --target sbpfv2-solana-solana \
library/core
44 changes: 44 additions & 0 deletions src/ci/docker/host-x86_64/sbpfv3-solana-solana/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
FROM ubuntu:22.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
g++ \
make \
ninja-build \
file \
curl \
ca-certificates \
python3 \
git \
cmake \
sudo \
gdb \
libssl-dev \
pkg-config \
xz-utils

ENV RUSTUP_INIT_SKIP_PATH_CHECK="yes"
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

RUN PATH="${HOME}/.cargo/bin:${PATH}" \
cargo install --git https://github.com/anza-xyz/cargo-run-solana-tests.git \
--rev c5df324a62a5e03d2ff5f9efbdbf5a4e4182325e \
--bin cargo-run-solana-tests --root /usr/local

COPY scripts/sccache.sh /scripts/
RUN sh /scripts/sccache.sh

# We are disabling CI LLVM since this builder is intentionally using a host
# LLVM, rather than the typical src/llvm-project LLVM.
ENV NO_DOWNLOAD_CI_LLVM 1

ENV RUST_CONFIGURE_ARGS \
--set rust.lld \
--set llvm.clang

ENV SCRIPT CARGO_TARGET_SBPFV3_SOLANA_SOLANA_RUNNER=\"cargo-run-solana-tests --heap-size 104857600\" \
LLVM_HOME=/checkout/obj/build/x86_64-unknown-linux-gnu/llvm \
PATH="${HOME}/.cargo/bin:${PATH}" \
python3 /checkout/x.py --stage 1 test --host='' --target sbpfv3-solana-solana \
library/core
19 changes: 13 additions & 6 deletions src/ci/github-actions/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -369,15 +369,19 @@ jobs:
<<: *job-linux-16c
tidy: false

- name: sbf-solana-solana-v1
- name: sbpf-solana-solana
<<: *job-linux-16c
tidy: false

- name: sbf-solana-solana-v2
- name: sbpfv1-solana-solana
<<: *job-linux-16c
tidy: false

- name: sbf-solana-solana-v3
- name: sbpfv2-solana-solana
<<: *job-linux-16c
tidy: false

- name: sbpfv3-solana-solana
<<: *job-linux-16c
tidy: false

Expand All @@ -402,13 +406,16 @@ jobs:
- name: sbf-solana-solana
<<: *job-linux-16c

- name: sbf-solana-solana-v1
- name: sbpf-solana-solana
<<: *job-linux-16c

- name: sbpfv1-solana-solana
<<: *job-linux-16c

- name: sbf-solana-solana-v2
- name: sbpfv2-solana-solana
<<: *job-linux-16c

- name: sbf-solana-solana-v3
- name: sbpfv3-solana-solana
<<: *job-linux-16c

auto:
Expand Down
4 changes: 4 additions & 0 deletions src/doc/rustc/src/platform-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,10 @@ target | std | host | notes
[`riscv64-linux-android`](platform-support/android.md) | | | RISC-V 64-bit Android
`s390x-unknown-linux-musl` | | | S390x Linux (kernel 3.2, musl 1.2.3)
`sbf-solana-solana` | ✓ | | SBF
`sbpf-solana-solana` | ✓ | | SBPF
`sbpfv1-solana-solana` | ✓ | | SBPF v1
`sbpfv2-solana-solana` | ✓ | | SBPF v2
`sbpfv3-solana-solana` | ✓ | | SBPF v3
`sparc-unknown-linux-gnu` | ✓ | | 32-bit SPARC Linux
[`sparc-unknown-none-elf`](./platform-support/sparc-unknown-none-elf.md) | * | | Bare 32-bit SPARC V7+
[`sparc64-unknown-netbsd`](platform-support/netbsd.md) | ✓ | ✓ | NetBSD/sparc64
Expand Down
4 changes: 4 additions & 0 deletions src/tools/build-manifest/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ static TARGETS: &[&str] = &[
"riscv64gc-unknown-linux-gnu",
"s390x-unknown-linux-gnu",
"sbf-solana-solana",
"sbpf-solana-solana",
"sbpfv1-solana-solana",
"sbpfv2-solana-solana",
"sbpfv3-solana-solana",
"sparc64-unknown-linux-gnu",
"sparcv9-sun-solaris",
"sparc-unknown-none-elf",
Expand Down
Loading

0 comments on commit 08b7341

Please sign in to comment.