From e1efa324eca5badeb481ea8a4a54eaa180e8c3fe Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Mon, 11 Jul 2016 00:22:13 +1000 Subject: [PATCH 1/7] Add help for target CPUs, features, relocation and code models. --- .gitmodules | 2 +- src/librustc/session/config.rs | 30 +++++++++++++++++++++++++-- src/librustc_driver/lib.rs | 24 +++++++++++++++++++++ src/librustc_llvm/lib.rs | 3 +++ src/llvm | 2 +- src/rustllvm/PassWrapper.cpp | 38 ++++++++++++++++++++++++++++++++++ 6 files changed, 95 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 39288a7ae49..02c06618a00 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "src/llvm"] path = src/llvm - url = https://github.com/rust-lang/llvm.git + url = https://github.com/bitshifter/llvm.git branch = master [submodule "src/compiler-rt"] path = src/compiler-rt diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 5ccc96210be..107dc6a4651 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -165,6 +165,10 @@ pub enum PrintRequest { CrateName, Cfg, TargetList, + TargetCPUs, + TargetFeatures, + RelocationModels, + CodeModels, } pub enum Input { @@ -1197,6 +1201,24 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { early_error(error_format, "Value for codegen units must be a positive nonzero integer"); } + let mut prints = Vec::::new(); + if cg.target_cpu.as_ref().map_or(false, |s| s == "help") { + prints.push(PrintRequest::TargetCPUs); + cg.target_cpu = None; + }; + if cg.target_feature == "help" { + prints.push(PrintRequest::TargetFeatures); + cg.target_feature = "".to_string(); + } + if cg.relocation_model.as_ref().map_or(false, |s| s == "help") { + prints.push(PrintRequest::RelocationModels); + cg.relocation_model = None; + } + if cg.code_model.as_ref().map_or(false, |s| s == "help") { + prints.push(PrintRequest::CodeModels); + cg.code_model = None; + } + let cg = cg; let sysroot_opt = matches.opt_str("sysroot").map(|m| PathBuf::from(&m)); @@ -1274,18 +1296,22 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { let cfg = parse_cfgspecs(matches.opt_strs("cfg")); let test = matches.opt_present("test"); - let prints = matches.opt_strs("print").into_iter().map(|s| { + prints.extend(matches.opt_strs("print").into_iter().map(|s| { match &*s { "crate-name" => PrintRequest::CrateName, "file-names" => PrintRequest::FileNames, "sysroot" => PrintRequest::Sysroot, "cfg" => PrintRequest::Cfg, "target-list" => PrintRequest::TargetList, + "target-cpus" => PrintRequest::TargetCPUs, + "target-features" => PrintRequest::TargetFeatures, + "relocation-models" => PrintRequest::RelocationModels, + "code-models" => PrintRequest::CodeModels, req => { early_error(error_format, &format!("unknown print request `{}`", req)) } } - }).collect::>(); + })); if !cg.remark.is_empty() && debuginfo == NoDebugInfo { early_warn(error_format, "-C remark will not show source locations without \ diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index c9569a63436..afa6f87f84f 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -69,6 +69,7 @@ use pretty::{PpMode, UserIdentifiedItem}; use rustc_resolve as resolve; use rustc_save_analysis as save; use rustc_trans::back::link; +use rustc_trans::back::write::create_target_machine; use rustc::dep_graph::DepGraph; use rustc::session::{self, config, Session, build_session, CompileResult}; use rustc::session::config::{Input, PrintRequest, OutputType, ErrorOutputType}; @@ -657,6 +658,29 @@ impl RustcDefaultCalls { } } } + PrintRequest::TargetCPUs => { + let tm = create_target_machine(sess); + unsafe { llvm::LLVMRustPrintTargetCPUs(tm); } + } + PrintRequest::TargetFeatures => { + let tm = create_target_machine(sess); + unsafe { llvm::LLVMRustPrintTargetFeatures(tm); } + } + PrintRequest::RelocationModels => { + println!("Available relocation models:\n"); + println!(" pic"); + println!(" static"); + println!(" default"); + println!(" dynamic-no-pic\n"); + } + PrintRequest::CodeModels => { + println!("Available code models:\n"); + println!(" default"); + println!(" small"); + println!(" kernel"); + println!(" medium"); + println!(" large\n"); + } } } return Compilation::Stop; diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index e757201c886..033342b81a4 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -2040,6 +2040,9 @@ extern { pub fn LLVMRustHasFeature(T: TargetMachineRef, s: *const c_char) -> bool; + pub fn LLVMRustPrintTargetCPUs(T: TargetMachineRef); + pub fn LLVMRustPrintTargetFeatures(T: TargetMachineRef); + pub fn LLVMRustCreateTargetMachine(Triple: *const c_char, CPU: *const c_char, Features: *const c_char, diff --git a/src/llvm b/src/llvm index 7ca76af03bb..31d7a402746 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit 7ca76af03bb04659562890d6b4f223fffe0d748f +Subproject commit 31d7a402746936d6a279d6e5bb7b1cfd88a66abd diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 3564f338a02..962e81b018b 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -162,6 +162,44 @@ LLVMRustHasFeature(LLVMTargetMachineRef TM, return (Bits & FeatureEntry->Value) == FeatureEntry->Value; } +/// getLongestEntryLength - Return the length of the longest entry in the table. +/// +static size_t getLongestEntryLength(ArrayRef Table) { + size_t MaxLen = 0; + for (auto &I : Table) + MaxLen = std::max(MaxLen, std::strlen(I.Key)); + return MaxLen; +} + +extern "C" void +LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM) { + const TargetMachine *Target = unwrap(TM); + const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo(); + const ArrayRef CPUTable = MCInfo->getCPUTable(); + unsigned MaxCPULen = getLongestEntryLength(CPUTable); + + printf("Available CPUs for this target:\n\n"); + for (auto &CPU : CPUTable) + printf(" %-*s - %s.\n", MaxCPULen, CPU.Key, CPU.Desc); + printf("\n"); +} + +extern "C" void +LLVMRustPrintTargetFeatures(LLVMTargetMachineRef TM) { + const TargetMachine *Target = unwrap(TM); + const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo(); + const ArrayRef FeatTable = MCInfo->getFeatureTable(); + unsigned MaxFeatLen = getLongestEntryLength(FeatTable); + + printf("Available features for this target:\n\n"); + for (auto &Feature : FeatTable) + printf(" %-*s - %s.\n", MaxFeatLen, Feature.Key, Feature.Desc); + printf("\n"); + + printf("Use +feature to enable a feature, or -feature to disable it.\n" + "For example, rustc -C -target-cpu=mycpu -C target-feature=+feature1,-feature2\n"); +} + extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(const char *triple, const char *cpu, From 09cc3e24a0fcbf031a7f7278556c3b5c0936fb03 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Tue, 19 Jul 2016 21:07:42 +1000 Subject: [PATCH 2/7] Update src/llvm to use the rust-lang version again. --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 02c06618a00..39288a7ae49 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "src/llvm"] path = src/llvm - url = https://github.com/bitshifter/llvm.git + url = https://github.com/rust-lang/llvm.git branch = master [submodule "src/compiler-rt"] path = src/compiler-rt From 87ed467077703ccada419c8b4cf183eed60467c7 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Tue, 19 Jul 2016 23:15:45 +1000 Subject: [PATCH 3/7] Hopefully this is the right llvm commit this time! --- src/llvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm b/src/llvm index 31d7a402746..a3c12a7ad8a 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit 31d7a402746936d6a279d6e5bb7b1cfd88a66abd +Subproject commit a3c12a7ad8a0d32a957f67f127936907b9ba522c From 6aee1e2a67d0608257a1087477e11e5b37e48d87 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Sun, 24 Jul 2016 17:27:23 +1000 Subject: [PATCH 4/7] Tidy ups for code gen options help Remove duplication code gen options and updated help to reflect changes. --- src/librustc/session/config.rs | 11 ++++++----- src/librustc_driver/lib.rs | 23 +++++++++++------------ src/librustc_trans/back/write.rs | 32 +++++++++++++++++++++----------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 2e511e34508..ed14c1e6417 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -604,9 +604,9 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, lto: bool = (false, parse_bool, "perform LLVM link-time optimizations"), target_cpu: Option = (None, parse_opt_string, - "select target processor (llc -mcpu=help for details)"), + "select target processor (rustc --print target-cpus for details)"), target_feature: String = ("".to_string(), parse_string, - "target specific attributes (llc -mattr=help for details)"), + "target specific attributes (rustc --print target-features for details)"), passes: Vec = (Vec::new(), parse_list, "a list of extra LLVM passes to run (space separated)"), llvm_args: Vec = (Vec::new(), parse_list, @@ -630,9 +630,9 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, no_redzone: Option = (None, parse_opt_bool, "disable the use of the redzone"), relocation_model: Option = (None, parse_opt_string, - "choose the relocation model to use (llc -relocation-model for details)"), + "choose the relocation model to use (rustc --print relocation-models for details)"), code_model: Option = (None, parse_opt_string, - "choose the code model to use (llc -code-model for details)"), + "choose the code model to use (rustc --print code-models for details)"), metadata: Vec = (Vec::new(), parse_list, "metadata to mangle symbol names with"), extra_filename: String = ("".to_string(), parse_string, @@ -993,7 +993,8 @@ pub fn rustc_short_optgroups() -> Vec { "[asm|llvm-bc|llvm-ir|obj|link|dep-info]"), opt::multi_s("", "print", "Comma separated list of compiler information to \ print on stdout", - "[crate-name|file-names|sysroot|cfg|target-list]"), + "[crate-name|file-names|sysroot|cfg|target-list|target-cpus|\ + target-features|relocation-models|code-models]"), opt::flagmulti_s("g", "", "Equivalent to -C debuginfo=2"), opt::flagmulti_s("O", "", "Equivalent to -C opt-level=2"), opt::opt_s("o", "", "Write output to ", "FILENAME"), diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index e539a732b11..f50ea9af493 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -69,7 +69,7 @@ use pretty::{PpMode, UserIdentifiedItem}; use rustc_resolve as resolve; use rustc_save_analysis as save; use rustc_trans::back::link; -use rustc_trans::back::write::create_target_machine; +use rustc_trans::back::write::{create_target_machine, RELOC_MODEL_ARGS, CODE_GEN_MODEL_ARGS}; use rustc::dep_graph::DepGraph; use rustc::session::{self, config, Session, build_session, CompileResult}; use rustc::session::config::{Input, PrintRequest, OutputType, ErrorOutputType}; @@ -676,19 +676,18 @@ impl RustcDefaultCalls { unsafe { llvm::LLVMRustPrintTargetFeatures(tm); } } PrintRequest::RelocationModels => { - println!("Available relocation models:\n"); - println!(" pic"); - println!(" static"); - println!(" default"); - println!(" dynamic-no-pic\n"); + println!("Available relocation models:"); + for &(name, _) in RELOC_MODEL_ARGS.iter() { + println!(" {}", name); + } + println!(""); } PrintRequest::CodeModels => { - println!("Available code models:\n"); - println!(" default"); - println!(" small"); - println!(" kernel"); - println!(" medium"); - println!(" large\n"); + println!("Available code models:"); + for &(name, _) in CODE_GEN_MODEL_ARGS.iter(){ + println!(" {}", name); + } + println!(""); } } } diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index 33cffa8a480..422e3d436b4 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -33,6 +33,21 @@ use std::sync::mpsc::channel; use std::thread; use libc::{c_uint, c_void}; +pub const RELOC_MODEL_ARGS : [(&'static str, llvm::RelocMode); 4] = [ + ("pic", llvm::RelocPIC), + ("static", llvm::RelocStatic), + ("default", llvm::RelocDefault), + ("dynamic-no-pic", llvm::RelocDynamicNoPic), +]; + +pub const CODE_GEN_MODEL_ARGS : [(&'static str, llvm::CodeGenModel); 5] = [ + ("default", llvm::CodeModelDefault), + ("small", llvm::CodeModelSmall), + ("kernel", llvm::CodeModelKernel), + ("medium", llvm::CodeModelMedium), + ("large", llvm::CodeModelLarge), +]; + pub fn llvm_err(handler: &errors::Handler, msg: String) -> ! { match llvm::last_error() { Some(err) => panic!(handler.fatal(&format!("{}: {}", msg, err))), @@ -156,11 +171,9 @@ pub fn create_target_machine(sess: &Session) -> TargetMachineRef { Some(ref s) => &s[..], None => &sess.target.target.options.relocation_model[..], }; - let reloc_model = match reloc_model_arg { - "pic" => llvm::RelocPIC, - "static" => llvm::RelocStatic, - "default" => llvm::RelocDefault, - "dynamic-no-pic" => llvm::RelocDynamicNoPic, + let reloc_model = match RELOC_MODEL_ARGS.iter().find( + |&&arg| arg.0 == reloc_model_arg) { + Some(x) => x.1, _ => { sess.err(&format!("{:?} is not a valid relocation mode", sess.opts @@ -186,12 +199,9 @@ pub fn create_target_machine(sess: &Session) -> TargetMachineRef { None => &sess.target.target.options.code_model[..], }; - let code_model = match code_model_arg { - "default" => llvm::CodeModelDefault, - "small" => llvm::CodeModelSmall, - "kernel" => llvm::CodeModelKernel, - "medium" => llvm::CodeModelMedium, - "large" => llvm::CodeModelLarge, + let code_model = match CODE_GEN_MODEL_ARGS.iter().find( + |&&arg| arg.0 == code_model_arg) { + Some(x) => x.1, _ => { sess.err(&format!("{:?} is not a valid code model", sess.opts From ce50bedd8ce2bca3bde12f6397f6d13889d2dae1 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Sun, 24 Jul 2016 19:49:10 +1000 Subject: [PATCH 5/7] Pass -DLLVM_RUSTLLVM to compile against rust llvm fork. If using system llvm don't try use modifications made in the fork. --- mk/rustllvm.mk | 6 ++++++ src/rustllvm/PassWrapper.cpp | 20 +++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/mk/rustllvm.mk b/mk/rustllvm.mk index 834a11d37fa..26b593c8c47 100644 --- a/mk/rustllvm.mk +++ b/mk/rustllvm.mk @@ -32,6 +32,11 @@ RUSTLLVM_INCS_$(1) = $$(LLVM_EXTRA_INCDIRS_$(1)) \ $$(call CFG_CC_INCLUDE_$(1),$$(S)src/rustllvm/include) RUSTLLVM_OBJS_OBJS_$(1) := $$(RUSTLLVM_OBJS_CS_$(1):rustllvm/%.cpp=$(1)/rustllvm/%.o) +# Flag that we are building with Rust's llvm fork +ifeq ($(CFG_LLVM_ROOT),) +RUSTLLVM_CXXFLAGS_$(1) := -DLLVM_RUSTLLVM +endif + # Note that we appease `cl.exe` and its need for some sort of exception # handling flag with the `EHsc` argument here as well. ifeq ($$(findstring msvc,$(1)),msvc) @@ -55,6 +60,7 @@ $(1)/rustllvm/%.o: $(S)src/rustllvm/%.cpp $$(MKFILE_DEPS) $$(LLVM_CONFIG_$(1)) $$(Q)$$(call CFG_COMPILE_CXX_$(1), $$@,) \ $$(subst /,//,$$(LLVM_CXXFLAGS_$(1))) \ $$(RUSTLLVM_COMPONENTS_$(1)) \ + $$(RUSTLLVM_CXXFLAGS_$(1)) \ $$(EXTRA_RUSTLLVM_CXXFLAGS_$(1)) \ $$(RUSTLLVM_INCS_$(1)) \ $$< diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 962e81b018b..b94e667701c 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -162,6 +162,7 @@ LLVMRustHasFeature(LLVMTargetMachineRef TM, return (Bits & FeatureEntry->Value) == FeatureEntry->Value; } +#if LLVM_RUSTLLVM /// getLongestEntryLength - Return the length of the longest entry in the table. /// static size_t getLongestEntryLength(ArrayRef Table) { @@ -178,7 +179,7 @@ LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM) { const ArrayRef CPUTable = MCInfo->getCPUTable(); unsigned MaxCPULen = getLongestEntryLength(CPUTable); - printf("Available CPUs for this target:\n\n"); + printf("Available CPUs for this target:\n"); for (auto &CPU : CPUTable) printf(" %-*s - %s.\n", MaxCPULen, CPU.Key, CPU.Desc); printf("\n"); @@ -191,15 +192,28 @@ LLVMRustPrintTargetFeatures(LLVMTargetMachineRef TM) { const ArrayRef FeatTable = MCInfo->getFeatureTable(); unsigned MaxFeatLen = getLongestEntryLength(FeatTable); - printf("Available features for this target:\n\n"); + printf("Available features for this target:\n"); for (auto &Feature : FeatTable) printf(" %-*s - %s.\n", MaxFeatLen, Feature.Key, Feature.Desc); printf("\n"); printf("Use +feature to enable a feature, or -feature to disable it.\n" - "For example, rustc -C -target-cpu=mycpu -C target-feature=+feature1,-feature2\n"); + "For example, rustc -C -target-cpu=mycpu -C target-feature=+feature1,-feature2\n\n"); } +#else + +extern "C" void +LLVMRustPrintTargetCPUs(LLVMTargetMachineRef) { + printf("Target CPU help is not supported by this LLVM version.\n\n"); +} + +extern "C" void +LLVMRustPrintTargetFeatures(LLVMTargetMachineRef) { + printf("Target features help is not supported by this LLVM version.\n\n"); +} +#endif + extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(const char *triple, const char *cpu, From fc210a8994174d48965453fa6cbeafc8902bd399 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Fri, 29 Jul 2016 23:09:32 +1000 Subject: [PATCH 6/7] Make rust build pass LLVM_RUSTLLVM to C++ compiler --- src/bootstrap/compile.rs | 4 ++++ src/librustc_llvm/build.rs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 8ec9c7f0109..31915b11691 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -199,6 +199,10 @@ pub fn rustc<'a>(build: &'a Build, target: &str, compiler: &Compiler<'a>) { if !build.unstable_features { cargo.env("CFG_DISABLE_UNSTABLE_FEATURES", "1"); } + // Flag that rust llvm is in use + if build.config.target_config.get(target).is_none() { + cargo.env("LLVM_RUSTLLVM", "1"); + } cargo.env("LLVM_CONFIG", build.llvm_config(target)); if build.config.llvm_static_stdcpp { cargo.env("LLVM_STATIC_STDCPP", diff --git a/src/librustc_llvm/build.rs b/src/librustc_llvm/build.rs index a2c808cbcb6..96b419d647e 100644 --- a/src/librustc_llvm/build.rs +++ b/src/librustc_llvm/build.rs @@ -112,6 +112,10 @@ fn main() { cfg.flag(&flag); } + if env::var_os("LLVM_RUSTLLVM").is_some() { + cfg.flag("-DLLVM_RUSTLLVM"); + } + cfg.file("../rustllvm/ExecutionEngineWrapper.cpp") .file("../rustllvm/PassWrapper.cpp") .file("../rustllvm/RustWrapper.cpp") From 05045da9fdab511f39e88335b1bc7f92ea7973ba Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Sat, 6 Aug 2016 15:54:28 +1000 Subject: [PATCH 7/7] Improved checking of target's llvm_config Point llvm @bitshifter branch until PR accepted Use today's date for LLVM auto clean trigger Update LLVM submodule to point at rust-lang fork. Handle case when target is set --- src/bootstrap/compile.rs | 2 +- src/bootstrap/lib.rs | 10 ++++++++++ src/llvm | 2 +- src/rustllvm/llvm-auto-clean-trigger | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 9e1ee7ccd1e..155848901cd 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -199,7 +199,7 @@ pub fn rustc<'a>(build: &'a Build, target: &str, compiler: &Compiler<'a>) { cargo.env("CFG_DISABLE_UNSTABLE_FEATURES", "1"); } // Flag that rust llvm is in use - if build.config.target_config.get(target).is_none() { + if build.is_rust_llvm(target) { cargo.env("LLVM_RUSTLLVM", "1"); } cargo.env("LLVM_CONFIG", build.llvm_config(target)); diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index acb7e0fadd9..5d61abe5e08 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -727,6 +727,16 @@ impl Build { self.out.join(target).join("llvm") } + /// Returns true if no custom `llvm-config` is set for the specified target. + /// + /// If no custom `llvm-config` was specified then Rust's llvm will be used. + fn is_rust_llvm(&self, target: &str) -> bool { + match self.config.target_config.get(target) { + Some(ref c) => c.llvm_config.is_none(), + None => true + } + } + /// Returns the path to `llvm-config` for the specified target. /// /// If a custom `llvm-config` was specified for target then that's returned diff --git a/src/llvm b/src/llvm index d295833b773..786aad117be 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit d295833b773313dbef26041f481fc91a2954fbb9 +Subproject commit 786aad117be48547f4ca50fae84c4879fa992d4d diff --git a/src/rustllvm/llvm-auto-clean-trigger b/src/rustllvm/llvm-auto-clean-trigger index e871763a48d..378810a8b89 100644 --- a/src/rustllvm/llvm-auto-clean-trigger +++ b/src/rustllvm/llvm-auto-clean-trigger @@ -1,4 +1,4 @@ # If this file is modified, then llvm will be forcibly cleaned and then rebuilt. # The actual contents of this file do not matter, but to trigger a change on the # build bots then the contents should be changed so git updates the mtime. -2016-07-25b +2016-08-07