提交 f07f4ef7 编写于 作者: B bors

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 
......@@ -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 {
......
// 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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册