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.
This commit is contained in:
parent
5120f4a3f9
commit
9a24025661
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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]
|
||||
|
@ -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
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(unwind_attributes)]
|
||||
|
||||
extern {
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(allocator)]
|
||||
|
||||
pub struct S {
|
||||
|
25
src/test/codegen/gdb_debug_script_load.rs
Normal file
25
src/test/codegen/gdb_debug_script_load.rs
Normal file
@ -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;
|
||||
}
|
@ -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"]
|
||||
|
@ -10,6 +10,8 @@
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub struct Bytes {
|
||||
a: u8,
|
||||
b: u8,
|
||||
|
@ -10,6 +10,8 @@
|
||||
|
||||
// compile-flags: -C no-prepopulate-passes
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub struct Bytes {
|
||||
a: u8,
|
||||
b: u8,
|
||||
|
Loading…
x
Reference in New Issue
Block a user