Skip to content

Commit 1b25c22

Browse files
committed
build: Try cross-language LTO
1 parent d01f32e commit 1b25c22

File tree

5 files changed

+128
-35
lines changed

5 files changed

+128
-35
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ similar = { opt-level = 3 }
286286
[profile.release]
287287
# Compile time seems similar to "lto = false", runtime ~10% faster
288288
lto = "thin"
289+
incremental = false
289290

290291
# Emit full debug info, allowing us to easily analyze core dumps from
291292
# staging (and, in an emergency, also prod).

ci/builder/Dockerfile

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,82 @@ RUN userdel -r ubuntu
108108

109109
ENTRYPOINT ["autouseradd", "--user", "materialize"]
110110

111-
# Stage 2: Build a full CI Builder image that can be used for any CI job.
111+
# Stage 2. Build a cross-compiling toolchain that targets the oldest version of
112+
# Linux that we support.
113+
#
114+
# TODO(parkmycar): This shouldn't be necessary anymore with Bazel.
115+
FROM ubuntu:noble-20250619 as crosstool
116+
117+
ARG ARCH_GCC
118+
ARG ARCH_GO
119+
120+
WORKDIR /scratch
121+
122+
# The environment variables are necessary to convince `tzdata`'s install scripts
123+
# not to hang.
124+
# See: https://serverfault.com/questions/949991/how-to-install-tzdata-on-a-ubuntu-docker-image
125+
RUN apt-get update --fix-missing && TZ=UTC DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
126+
autoconf \
127+
automake \
128+
bison \
129+
bzip2 \
130+
ca-certificates \
131+
curl \
132+
file \
133+
flex \
134+
gawk \
135+
g++ \
136+
gcc \
137+
gnupg2 \
138+
help2man \
139+
libc-dev \
140+
libncurses-dev \
141+
libstdc++6 \
142+
libstdc++-13-dev \
143+
libtool-bin \
144+
llvm \
145+
make \
146+
patch \
147+
texinfo \
148+
unzip \
149+
xz-utils
150+
151+
COPY crosstool.asc ./
152+
153+
# Faster uncompression
154+
ARG XZ_OPT=-T0
155+
156+
RUN gpg --import crosstool.asc \
157+
&& rm crosstool.asc \
158+
&& echo "trusted-key 09f6dd5f1f30ef2e" >> ~/.gnupg/gpg.conf \
159+
&& mkdir crosstool \
160+
&& curl -fsSL https://github.com/crosstool-ng/crosstool-ng/releases/download/crosstool-ng-1.26.0/crosstool-ng-1.26.0.tar.xz > crosstool.tar.xz \
161+
&& curl -fsSL https://github.com/crosstool-ng/crosstool-ng/releases/download/crosstool-ng-1.26.0/crosstool-ng-1.26.0.tar.xz.sig > crosstool.sig \
162+
&& gpg --verify crosstool.sig crosstool.tar.xz \
163+
&& tar -xf crosstool.tar.xz -C crosstool --strip-components=1 \
164+
&& rm crosstool.sig crosstool.tar.xz \
165+
&& (cd crosstool && ./configure && make install) \
166+
&& rm -rf crosstool
167+
168+
COPY crosstool-$ARCH_GCC.defconfig ./
169+
170+
RUN DEFCONFIG=crosstool-$ARCH_GCC.defconfig ct-ng defconfig \
171+
&& rm crosstool-$ARCH_GCC.defconfig \
172+
&& ct-ng build
173+
174+
# Stage 3: Build a full CI Builder image that imports the cross-compiling
175+
# toolchain and can be used for any CI job.
112176
FROM ci-builder-min as ci-builder-full
113177

114178
ARG ARCH_GCC
115179
ARG ARCH_GO
116180

117181
WORKDIR /workdir
118182

183+
# Import the cross toolchain.
184+
185+
COPY --from=crosstool /opt/x-tools /opt/x-tools
186+
119187
# Install dependencies needed by any CI job. Not all of these are available in
120188
# the Ubuntu repositories.
121189
RUN apt-get update --fix-missing && TZ=UTC DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
@@ -238,6 +306,11 @@ RUN mkdir rust \
238306
&& cargo install --root /usr/local --version "=0.3.6" --locked cargo-binutils \
239307
&& cargo install --root /usr/local --version "=0.13.1" --locked wasm-pack
240308

309+
# Link the system lld into the cross-compiling sysroot.
310+
311+
RUN ln -s /usr/bin/lld /opt/x-tools/$ARCH_GCC-unknown-linux-gnu/bin/$ARCH_GCC-unknown-linux-gnu-ld.lld \
312+
&& ln -s /usr/bin/lld /opt/x-tools/$ARCH_GCC-unknown-linux-gnu/bin/$ARCH_GCC-unknown-linux-gnu-lld
313+
241314
# Shims for sanitizers
242315
COPY sanshim/$ARCH_GCC /sanshim
243316

@@ -347,11 +420,27 @@ RUN curl -fsSL https://amazon-inspector-sbomgen.s3.amazonaws.com/1.8.1/linux/$AR
347420
# trustworthy on the first connection.
348421
COPY ssh_known_hosts /etc/ssh/ssh_known_hosts
349422

423+
# Set the necessary environment variables to point Cargo and C/C++ build systems
424+
# at our cross-compiling toolchain.
425+
426+
ENV AR=$ARCH_GCC-unknown-linux-gnu-ar
427+
ENV LD=$ARCH_GCC-unknown-linux-gnu-lld
428+
ENV RANLIB=$ARCH_GCC-unknown-linux-gnu-ranlib
429+
ENV CPP=$ARCH_GCC-unknown-linux-gnu-cpp
430+
ENV CC=$ARCH_GCC-unknown-linux-gnu-cc
431+
ENV CXX=$ARCH_GCC-unknown-linux-gnu-c++
432+
ENV CXXSTDLIB=static=stdc++
350433
ENV LDFLAGS="-fuse-ld=lld -static-libstdc++"
351-
ENV RUSTFLAGS="-Clink-arg=-Wl,--compress-debug-sections=zlib -Clink-arg=-Wl,-O3 -Clink-arg=-fuse-ld=lld -Csymbol-mangling-version=v0 -Ctarget-cpu=$RUST_CPU_TARGET -Ctarget-feature=$RUST_TARGET_FEATURES --cfg=tokio_unstable"
352-
ENV PATH=/opt/google-cloud-sdk/bin:$PATH
434+
ENV RUSTFLAGS="-Clink-arg=-Wl,--compress-debug-sections=zlib -Clink-arg=-Wl,-O3 -Clink-arg=-fuse-ld=lld -L/opt/x-tools/$ARCH_GCC-unknown-linux-gnu/$ARCH_GCC-unknown-linux-gnu/sysroot/lib/ -Csymbol-mangling-version=v0 --cfg=tokio_unstable"
435+
ENV TARGET_AR=$AR
436+
ENV TARGET_CC=$CC
437+
ENV TARGET_CXX=$CXX
438+
ENV TARGET_CXXSTDLIB=static=stdc++
439+
ENV TARGET_RANLIB=$RANLIB
440+
ENV PATH=/opt/google-cloud-sdk/bin:/opt/x-tools/$ARCH_GCC-unknown-linux-gnu/bin:$PATH
441+
ENV CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-unknown-linux-gnu-cc
442+
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-unknown-linux-gnu-cc
353443
ENV CARGO_TARGET_DIR=/mnt/build
354-
ENV CARGO_INCREMENTAL=1
355444
ENV HELM_PLUGINS=/usr/local/share/helm/plugins
356445

357446
# Set up for a persistent volume to hold Cargo metadata, so that crate metadata

misc/python/materialize/mzbuild.py

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -384,38 +384,35 @@ def generate_cargo_build_command(
384384
else (
385385
rustc_flags.sanitizer[rd.sanitizer]
386386
if rd.sanitizer != Sanitizer.none
387-
else ["--cfg=tokio_unstable"]
387+
else ["--cfg=tokio_unstable", "-Clink-arg=-fuse-ld=lld", "-Clinker=clang++"]
388388
)
389389
)
390-
cflags = (
391-
[
392-
f"--target={target(rd.arch)}",
393-
f"--gcc-toolchain=/opt/x-tools/{target(rd.arch)}/",
394-
"-fuse-ld=lld",
395-
f"--sysroot=/opt/x-tools/{target(rd.arch)}/{target(rd.arch)}/sysroot",
396-
f"-L/opt/x-tools/{target(rd.arch)}/{target(rd.arch)}/lib64",
397-
]
398-
+ rustc_flags.sanitizer_cflags[rd.sanitizer]
399-
if rd.sanitizer != Sanitizer.none
400-
else []
401-
)
402-
extra_env = (
403-
{
404-
"CFLAGS": " ".join(cflags),
405-
"CXXFLAGS": " ".join(cflags),
406-
"LDFLAGS": " ".join(cflags),
407-
"CXXSTDLIB": "stdc++",
408-
"CC": "cc",
409-
"CXX": "c++",
410-
"CPP": "clang-cpp-18",
411-
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER": "cc",
412-
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER": "cc",
413-
"PATH": f"/sanshim:/opt/x-tools/{target(rd.arch)}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
414-
"TSAN_OPTIONS": "report_bugs=0", # build-scripts fail
415-
}
416-
if rd.sanitizer != Sanitizer.none
417-
else {}
418-
)
390+
cflags = [
391+
f"--target={target(rd.arch)}",
392+
f"--gcc-toolchain=/opt/x-tools/{target(rd.arch)}/",
393+
"-flto",
394+
"-fuse-ld=lld",
395+
f"--sysroot=/opt/x-tools/{target(rd.arch)}/{target(rd.arch)}/sysroot",
396+
f"-L/opt/x-tools/{target(rd.arch)}/{target(rd.arch)}/lib64",
397+
"-O3",
398+
]
399+
if rd.sanitizer != Sanitizer.none:
400+
cflags += rustc_flags.sanitizer_cflags[rd.sanitizer]
401+
402+
extra_env = {
403+
"CFLAGS": " ".join(cflags),
404+
"CXXFLAGS": " ".join(cflags),
405+
"LDFLAGS": " ".join(cflags),
406+
"CXXSTDLIB": "stdc++",
407+
"CC": "/sanshim/cc",
408+
"CXX": "/sanshim/c++",
409+
"CPP": "clang-cpp-18",
410+
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER": "/sanshim/cc",
411+
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER": "/sanshim/cc",
412+
"PATH": f"/sanshim:/opt/x-tools/{target(rd.arch)}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
413+
}
414+
if rd.sanitizer != Sanitizer.none:
415+
extra_env["TSAN_OPTIONS"] = "report_bugs=0" # build-scripts fail
419416

420417
cargo_build = rd.build(
421418
"build", channel=None, rustflags=rustflags, extra_env=extra_env

misc/python/materialize/rustc_flags.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,30 +62,35 @@ def __str__(self) -> str:
6262
"-Cdebug-assertions=on",
6363
"-Clink-arg=-fuse-ld=lld", # access beyond end of merged section
6464
"-Clinker=clang++",
65+
"--cfg=tokio_unstable",
6566
],
6667
Sanitizer.hwaddress: [
6768
"-Zsanitizer=hwaddress",
6869
"-Ctarget-feature=+tagged-globals",
6970
"-Clink-arg=-fuse-ld=lld", # access beyond end of merged section
7071
"-Clinker=clang++",
72+
"--cfg=tokio_unstable",
7173
],
7274
Sanitizer.cfi: [
7375
"-Zsanitizer=cfi",
7476
"-Clto", # error: `-Zsanitizer=cfi` requires `-Clto` or `-Clinker-plugin-lto`
7577
"-Clink-arg=-fuse-ld=lld", # access beyond end of merged section
7678
"-Clinker=clang++",
79+
"--cfg=tokio_unstable",
7780
],
7881
Sanitizer.thread: [
7982
"-Zsanitizer=thread",
8083
"-Clink-arg=-fuse-ld=lld", # access beyond end of merged section
8184
"-Clinker=clang++",
85+
"--cfg=tokio_unstable",
8286
],
8387
Sanitizer.leak: [
8488
"-Zsanitizer=leak",
8589
"-Clink-arg=-fuse-ld=lld", # access beyond end of merged section
8690
"-Clinker=clang++",
91+
"--cfg=tokio_unstable",
8792
],
88-
Sanitizer.undefined: ["-Clink-arg=-fsanitize=undefined", "-Clinker=clang++"],
93+
Sanitizer.undefined: ["-Clink-arg=-fsanitize=undefined", "-Clinker=clang++", "--cfg=tokio_unstable"],
8994
}
9095

9196
sanitizer_cflags = {

src/ore/src/env.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ where
3232
Some(val) => val != "0" && val != "false" && val != "",
3333
}
3434
}
35+

0 commit comments

Comments
 (0)