From 9a2402566102dd54c66f55a62da93e1c7d93f761 Mon Sep 17 00:00:00 2001 From: Richard Diamond Date: Tue, 15 Sep 2015 16:22:16 -0500 Subject: [PATCH] Avoid loading the whole gdb debug scripts section. This is so LLVM isn't forced to load every byte of it. Also sets the alignment of the load. Adds a test for the debug script section. --- src/compiletest/runtest.rs | 3 +-- src/librustc_trans/trans/debuginfo/gdb.rs | 14 +++++++++++-- src/test/codegen/adjustments.rs | 2 ++ src/test/codegen/coercions.rs | 2 ++ src/test/codegen/extern-functions.rs | 1 + src/test/codegen/function-arguments.rs | 1 + src/test/codegen/gdb_debug_script_load.rs | 25 +++++++++++++++++++++++ src/test/codegen/link_section.rs | 2 ++ src/test/codegen/loads.rs | 2 ++ src/test/codegen/stores.rs | 2 ++ 10 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/test/codegen/gdb_debug_script_load.rs diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index 12f560be456..8db6725f7a8 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -1669,8 +1669,7 @@ fn compile_test_and_save_ir(config: &Config, props: &TestProps, // FIXME (#9639): This needs to handle non-utf8 paths let mut link_args = vec!("-L".to_owned(), aux_dir.to_str().unwrap().to_owned()); - let llvm_args = vec!("--emit=llvm-ir".to_owned(), - "--crate-type=lib".to_owned()); + let llvm_args = vec!("--emit=llvm-ir".to_owned(),); link_args.extend(llvm_args); let args = make_compile_args(config, props, diff --git a/src/librustc_trans/trans/debuginfo/gdb.rs b/src/librustc_trans/trans/debuginfo/gdb.rs index f7b0f37c9ff..ffef7e71a77 100644 --- a/src/librustc_trans/trans/debuginfo/gdb.rs +++ b/src/librustc_trans/trans/debuginfo/gdb.rs @@ -13,7 +13,7 @@ use llvm; use llvm::ValueRef; -use trans::common::{C_bytes, CrateContext}; +use trans::common::{C_bytes, CrateContext, C_i32}; use trans::declare; use trans::type_::Type; use session::config::NoDebugInfo; @@ -31,11 +31,21 @@ pub fn insert_reference_to_gdb_debug_scripts_section_global(ccx: &CrateContext) let gdb_debug_scripts_section_global = get_or_insert_gdb_debug_scripts_section_global(ccx); unsafe { + // Load just the first byte as that's all that's necessary to force + // LLVM to keep around the reference to the global. + let indices = [C_i32(ccx, 0), C_i32(ccx, 0)]; + let element = + llvm::LLVMBuildInBoundsGEP(ccx.raw_builder(), + gdb_debug_scripts_section_global, + indices.as_ptr(), + indices.len() as ::libc::c_uint, + empty.as_ptr()); let volative_load_instruction = llvm::LLVMBuildLoad(ccx.raw_builder(), - gdb_debug_scripts_section_global, + element, empty.as_ptr()); llvm::LLVMSetVolatile(volative_load_instruction, llvm::True); + llvm::LLVMSetAlignment(volative_load_instruction, 1); } } } diff --git a/src/test/codegen/adjustments.rs b/src/test/codegen/adjustments.rs index d9a7acf1129..a61fa84398e 100644 --- a/src/test/codegen/adjustments.rs +++ b/src/test/codegen/adjustments.rs @@ -10,6 +10,8 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] + // Hack to get the correct size for the length part in slices // CHECK: @helper([[USIZE:i[0-9]+]]) #[no_mangle] diff --git a/src/test/codegen/coercions.rs b/src/test/codegen/coercions.rs index 2a136d7024d..c8c9f5b407c 100644 --- a/src/test/codegen/coercions.rs +++ b/src/test/codegen/coercions.rs @@ -10,6 +10,8 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] + static X: i32 = 5; // CHECK-LABEL: @raw_ptr_to_raw_ptr_noop diff --git a/src/test/codegen/extern-functions.rs b/src/test/codegen/extern-functions.rs index 4c30b5ce02f..ff9d54e67e4 100644 --- a/src/test/codegen/extern-functions.rs +++ b/src/test/codegen/extern-functions.rs @@ -10,6 +10,7 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] #![feature(unwind_attributes)] extern { diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index 7706c97380b..90ced88324e 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -10,6 +10,7 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] #![feature(allocator)] pub struct S { diff --git a/src/test/codegen/gdb_debug_script_load.rs b/src/test/codegen/gdb_debug_script_load.rs new file mode 100644 index 00000000000..efaca29752b --- /dev/null +++ b/src/test/codegen/gdb_debug_script_load.rs @@ -0,0 +1,25 @@ +// Copyright 2015 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. + +// ignore-tidy-linelength +// ignore-windows +// ignore-macos + +// compile-flags: -g -C no-prepopulate-passes + +#![feature(start)] + +// CHECK-LABEL: @main +// CHECK: load volatile i8, i8* getelementptr inbounds ([[B:\[[0-9]* x i8\]]], [[B]]* @__rustc_debug_gdb_scripts_section__, i32 0, i32 0), align 1 + +#[start] +fn start(_: isize, _: *const *const u8) -> isize { + return 0; +} diff --git a/src/test/codegen/link_section.rs b/src/test/codegen/link_section.rs index 99b43552b0d..5ad3854c05c 100644 --- a/src/test/codegen/link_section.rs +++ b/src/test/codegen/link_section.rs @@ -10,6 +10,8 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] + // CHECK: @VAR1 = constant i32 1, section ".test_one" #[no_mangle] #[link_section = ".test_one"] diff --git a/src/test/codegen/loads.rs b/src/test/codegen/loads.rs index b51da69fef2..21f23b6ea18 100644 --- a/src/test/codegen/loads.rs +++ b/src/test/codegen/loads.rs @@ -10,6 +10,8 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] + pub struct Bytes { a: u8, b: u8, diff --git a/src/test/codegen/stores.rs b/src/test/codegen/stores.rs index 72862ea8b6f..5d2d47e1bf3 100644 --- a/src/test/codegen/stores.rs +++ b/src/test/codegen/stores.rs @@ -10,6 +10,8 @@ // compile-flags: -C no-prepopulate-passes +#![crate_type = "lib"] + pub struct Bytes { a: u8, b: u8,