about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-09-22 03:35:55 +0000
committerbors <bors@rust-lang.org>2015-09-22 03:35:55 +0000
commitf07f4ef74366f70554cb0f2cef590e76bfd55791 (patch)
tree4dc2718e88929efd94a563aacaadb437d3f37e1e /src
parente9d2587766a30d30491ec96dab5cc5d741ae043a (diff)
parent9a2402566102dd54c66f55a62da93e1c7d93f761 (diff)
downloadrust-f07f4ef74366f70554cb0f2cef590e76bfd55791.tar.gz
rust-f07f4ef74366f70554cb0f2cef590e76bfd55791.zip
Auto merge of #28427 - DiamondLovesYou:gdb-debug-script-load, r=alexcrichton
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.

r? @alexcrichton 
Diffstat (limited to 'src')
-rw-r--r--src/compiletest/runtest.rs3
-rw-r--r--src/librustc_trans/trans/debuginfo/gdb.rs14
-rw-r--r--src/test/codegen/adjustments.rs2
-rw-r--r--src/test/codegen/coercions.rs2
-rw-r--r--src/test/codegen/extern-functions.rs1
-rw-r--r--src/test/codegen/function-arguments.rs1
-rw-r--r--src/test/codegen/gdb_debug_script_load.rs25
-rw-r--r--src/test/codegen/link_section.rs2
-rw-r--r--src/test/codegen/loads.rs2
-rw-r--r--src/test/codegen/stores.rs2
10 files changed, 50 insertions, 4 deletions
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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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,