Rollup merge of #111772 - liushuyu:ubuntu/mips64-linkage, r=jackh726

Fix linkage for large binaries on mips64 platforms

This pull request fixes the linkage for large binaries on mips64 platforms by enabling the `xgot` feature in LLVM.

It is well understood that the generated binary will gain a hefty performance penalty where the external symbol jumps now cost at least three instructions each.

Also, this pull request does not address the same issue on the mips32 counterparts (due to being unable to test the changes thoroughly).

Should fix #52108
This commit is contained in:
Matthias Krüger 2023-05-31 11:19:07 +02:00 committed by GitHub
commit fd1c0d8585
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 16 additions and 6 deletions

View file

@ -12,7 +12,7 @@ pub fn target() -> Target {
endian: Endian::Big,
// NOTE(mips64r2) matches C toolchain
cpu: "mips64r2".into(),
features: "+mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),

View file

@ -10,7 +10,7 @@ pub fn target() -> Target {
abi: "abi64".into(),
// NOTE(mips64r2) matches C toolchain
cpu: "mips64r2".into(),
features: "+mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),

View file

@ -877,6 +877,12 @@ class RustBuild(object):
# preserve existing RUSTFLAGS
env.setdefault("RUSTFLAGS", "")
# we need to explicitly add +xgot here so that we can successfully bootstrap
# a usable stage1 compiler
# FIXME: remove this if condition on the next bootstrap bump
# cfg(bootstrap)
if self.build_triple().startswith('mips'):
env["RUSTFLAGS"] += " -Ctarget-feature=+xgot"
target_features = []
if self.get_toml("crt-static", build_section) == "true":
target_features += ["+crt-static"]

View file

@ -72,7 +72,7 @@ macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
// mips32-LABEL: sym_static_32:
// mips32: #APP
// mips32: lw $3, %got(extern_static)
// mips32: lw $3, %got(extern_static)($gp)
// mips32: #NO_APP
#[cfg(mips32)]
#[no_mangle]
@ -82,7 +82,7 @@ pub unsafe fn sym_static_32() {
// mips32-LABEL: sym_fn_32:
// mips32: #APP
// mips32: lw $3, %got(extern_func)
// mips32: lw $3, %got(extern_func)($gp)
// mips32: #NO_APP
#[cfg(mips32)]
#[no_mangle]
@ -92,7 +92,9 @@ pub unsafe fn sym_fn_32() {
// mips64-LABEL: sym_static_64:
// mips64: #APP
// mips64: ld $3, %got_disp(extern_static)
// mips64: lui $3, %got_hi(extern_static)
// mips64: daddu $3, $3, $gp
// mips64: ld $3, %got_lo(extern_static)($3)
// mips64: #NO_APP
#[cfg(mips64)]
#[no_mangle]
@ -102,7 +104,9 @@ pub unsafe fn sym_static_64() {
// mips64-LABEL: sym_fn_64:
// mips64: #APP
// mips64: ld $3, %got_disp(extern_func)
// mips64: lui $3, %got_hi(extern_func)
// mips64: daddu $3, $3, $gp
// mips64: ld $3, %got_lo(extern_func)($3)
// mips64: #NO_APP
#[cfg(mips64)]
#[no_mangle]