From b78ac5b74a62e7b2772d322004a6bb04967f8437 Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Sat, 5 Apr 2014 14:10:13 +0200 Subject: [PATCH] Add support for different relocation models Rust currently defaults to `RelocPIC` regardless. This patch adds a new codegen option that allows choosing different relocation-model. The available models are: - default (Use the target-specific default model) - static - pic - no-pic For a more detailed information use `llc --help` --- src/etc/zsh/_rust | 1 + src/librustc/back/link.rs | 15 ++++++++++++++- src/librustc/driver/session.rs | 2 ++ src/test/run-make/relocation-model/Makefile | 15 +++++++++++++++ src/test/run-make/relocation-model/foo.rs | 11 +++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/test/run-make/relocation-model/Makefile create mode 100644 src/test/run-make/relocation-model/foo.rs diff --git a/src/etc/zsh/_rust b/src/etc/zsh/_rust index f1f9e88f7c9..0a5bfdb4ebb 100644 --- a/src/etc/zsh/_rust +++ b/src/etc/zsh/_rust @@ -36,6 +36,7 @@ _rustc_opts_switches=( --target'[Target triple cpu-manufacturer-kernel\[-os\] to compile]' --target-cpu'[Select target processor (llc -mcpu=help for details)]' --target-feature'[Target specific attributes (llc -mattr=help for details)]' + --relocation-model'[Relocation model (llc --help for details)]' {-v,--version}'[Print version info and exit]' ) _rustc_opts_lint=( diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index e9292f54a4b..9e9602556d4 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -152,13 +152,26 @@ pub mod write { (sess.targ_cfg.os == abi::OsMacos && sess.targ_cfg.arch == abi::X86_64); + let reloc_model = match sess.opts.cg.relocation_model.as_slice() { + "pic" => lib::llvm::RelocPIC, + "static" => lib::llvm::RelocStatic, + "default" => lib::llvm::RelocDefault, + "dynamic-no-pic" => lib::llvm::RelocDynamicNoPic, + _ => { + sess.err(format!("{} is not a valid relocation mode", + sess.opts.cg.relocation_model)); + sess.abort_if_errors(); + return; + } + }; + let tm = sess.targ_cfg.target_strs.target_triple.with_c_str(|t| { sess.opts.cg.target_cpu.with_c_str(|cpu| { target_feature(sess).with_c_str(|features| { llvm::LLVMRustCreateTargetMachine( t, cpu, features, lib::llvm::CodeModelDefault, - lib::llvm::RelocPIC, + reloc_model, opt_level, true, use_softfp, diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index c2fec3871ab..80003892301 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -455,6 +455,8 @@ cgoptions!( "prefer dynamic linking to static linking"), no_integrated_as: bool = (false, parse_bool, "use an external assembler rather than LLVM's integrated one"), + relocation_model: ~str = (~"pic", parse_string, + "choose the relocation model to use (llc -relocation-model for details)"), ) // Seems out of place, but it uses session, so I'm putting it here diff --git a/src/test/run-make/relocation-model/Makefile b/src/test/run-make/relocation-model/Makefile new file mode 100644 index 00000000000..2fcdd32bfcb --- /dev/null +++ b/src/test/run-make/relocation-model/Makefile @@ -0,0 +1,15 @@ +-include ../tools.mk + +all: + $(RUSTC) -C relocation-model=dynamic-no-pic foo.rs + $(call RUN,foo) + + $(RUSTC) -C relocation-model=default foo.rs + $(call RUN,foo) + + $(RUSTC) -C relocation-model=static foo.rs + $(call RUN,foo) + + $(RUSTC) -C relocation-model=default --crate-type=dylib foo.rs + $(RUSTC) -C relocation-model=static --crate-type=dylib foo.rs + $(RUSTC) -C relocation-model=dynamic-no-pic --crate-type=dylib foo.rs diff --git a/src/test/run-make/relocation-model/foo.rs b/src/test/run-make/relocation-model/foo.rs new file mode 100644 index 00000000000..e06d81cd60b --- /dev/null +++ b/src/test/run-make/relocation-model/foo.rs @@ -0,0 +1,11 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub fn main() {}