auto merge of #13143 : gentlefolk/rust/issue-9227, r=michaelwoerister

Only supports crate level statics. No debug info is generated for function level statics. Closes #9227.

As discussed at the end of the comments for #9227, I took an initial stab at adding support for function level statics and decided it would be enough work to warrant being split into a separate issue.

See #13144 for the new issue describing the need to add support for function level static variables.
This commit is contained in:
bors 2014-03-29 10:21:39 -07:00
commit 3eb3a02c92
15 changed files with 733 additions and 99 deletions

View File

@ -277,6 +277,7 @@ pub enum DIBuilder_opaque {}
pub type DIDerivedType = DIType;
pub type DICompositeType = DIDerivedType;
pub type DIVariable = DIDescriptor;
pub type DIGlobalVariable = DIDescriptor;
pub type DIArray = DIDescriptor;
pub type DISubrange = DIDescriptor;
@ -1589,6 +1590,18 @@ pub fn LLVMDIBuilderCreateLexicalBlock(Builder: DIBuilderRef,
Col: c_uint)
-> DILexicalBlock;
pub fn LLVMDIBuilderCreateStaticVariable(Builder: DIBuilderRef,
Context: DIDescriptor,
Name: *c_char,
LinkageName: *c_char,
File: DIFile,
LineNo: c_uint,
Ty: DIType,
isLocalToUnit: bool,
Val: ValueRef,
Decl: ValueRef)
-> DIGlobalVariable;
pub fn LLVMDIBuilderCreateLocalVariable(Builder: DIBuilderRef,
Tag: c_uint,
Scope: DIDescriptor,

View File

@ -28,6 +28,7 @@
use middle::trans::machine;
use middle::trans::type_::Type;
use middle::trans::type_of;
use middle::trans::debuginfo;
use middle::ty;
use util::ppaux::{Repr, ty_to_str};
@ -688,5 +689,6 @@ pub fn trans_const(ccx: &CrateContext, m: ast::Mutability, id: ast::NodeId) {
if m != ast::MutMutable {
llvm::LLVMSetGlobalConstant(g, True);
}
debuginfo::create_global_var_metadata(ccx, id, g);
}
}

View File

@ -280,6 +280,66 @@ pub fn finalize(cx: &CrateContext) {
};
}
/// Creates debug information for the given global variable.
///
/// Adds the created metadata nodes directly to the crate's IR.
pub fn create_global_var_metadata(cx: &CrateContext,
node_id: ast::NodeId,
global: ValueRef) {
if cx.dbg_cx.is_none() {
return;
}
let var_item = cx.tcx.map.get(node_id);
let (ident, span) = match var_item {
ast_map::NodeItem(item) => {
match item.node {
ast::ItemStatic(..) => (item.ident, item.span),
_ => cx.sess().span_bug(item.span,
format!("debuginfo::create_global_var_metadata() -
Captured var-id refers to unexpected ast_item
variant: {:?}",
var_item))
}
},
_ => cx.sess().bug(format!("debuginfo::create_global_var_metadata() - Captured var-id \
refers to unexpected ast_map variant: {:?}",
var_item))
};
let filename = span_start(cx, span).file.name.clone();
let file_metadata = file_metadata(cx, filename);
let is_local_to_unit = is_node_local_to_unit(cx, node_id);
let loc = span_start(cx, span);
let variable_type = ty::node_id_to_type(cx.tcx(), node_id);
let type_metadata = type_metadata(cx, variable_type, span);
let namespace_node = namespace_for_item(cx, ast_util::local_def(node_id));
let var_name = token::get_ident(ident).get().to_str();
let linkage_name = namespace_node.mangled_name_of_contained_item(var_name);
let var_scope = namespace_node.scope;
var_name.with_c_str(|var_name| {
linkage_name.with_c_str(|linkage_name| {
unsafe {
llvm::LLVMDIBuilderCreateStaticVariable(DIB(cx),
var_scope,
var_name,
linkage_name,
file_metadata,
loc.line as c_uint,
type_metadata,
is_local_to_unit,
global,
ptr::null());
}
})
});
}
/// Creates debug information for the given local variable.
///
/// Adds the created metadata nodes directly to the crate's IR.
@ -640,13 +700,7 @@ pub fn create_function_debug_context(cx: &CrateContext,
// Clang sets this parameter to the opening brace of the function's block, so let's do this too.
let scope_line = span_start(cx, top_level_block.span).line;
// The is_local_to_unit flag indicates whether a function is local to the current compilation
// unit (i.e. if it is *static* in the C-sense). The *reachable* set should provide a good
// approximation of this, as it contains everything that might leak out of the current crate
// (by being externally visible or by being inlined into something externally visible). It might
// better to use the `exported_items` set from `driver::CrateAnalysis` in the future, but (atm)
// this set is not available in the translation pass.
let is_local_to_unit = !cx.reachable.contains(&fn_ast_id);
let is_local_to_unit = is_node_local_to_unit(cx, fn_ast_id);
let fn_metadata = function_name.with_c_str(|function_name| {
linkage_name.with_c_str(|linkage_name| {
@ -854,6 +908,17 @@ fn get_template_parameters(cx: &CrateContext,
// Module-Internal debug info creation functions
//=-------------------------------------------------------------------------------------------------
fn is_node_local_to_unit(cx: &CrateContext, node_id: ast::NodeId) -> bool
{
// The is_local_to_unit flag indicates whether a function is local to the current compilation
// unit (i.e. if it is *static* in the C-sense). The *reachable* set should provide a good
// approximation of this, as it contains everything that might leak out of the current crate
// (by being externally visible or by being inlined into something externally visible). It might
// better to use the `exported_items` set from `driver::CrateAnalysis` in the future, but (atm)
// this set is not available in the translation pass.
!cx.reachable.contains(&node_id)
}
fn create_DIArray(builder: DIBuilderRef, arr: &[DIDescriptor]) -> DIArray {
return unsafe {
llvm::LLVMDIBuilderGetOrCreateArray(builder, arr.as_ptr(), arr.len() as u32)

View File

@ -323,6 +323,28 @@ extern "C" LLVMValueRef LLVMDIBuilderCreateLexicalBlock(
unwrapDI<DIFile>(File), Line, Col));
}
extern "C" LLVMValueRef LLVMDIBuilderCreateStaticVariable(
DIBuilderRef Builder,
LLVMValueRef Context,
const char* Name,
const char* LinkageName,
LLVMValueRef File,
unsigned LineNo,
LLVMValueRef Ty,
bool isLocalToUnit,
LLVMValueRef Val,
LLVMValueRef Decl = NULL) {
return wrap(Builder->createStaticVariable(unwrapDI<DIDescriptor>(Context),
Name,
LinkageName,
unwrapDI<DIFile>(File),
LineNo,
unwrapDI<DIType>(Ty),
isLocalToUnit,
unwrap(Val),
unwrapDI<MDNode*>(Decl)));
}
extern "C" LLVMValueRef LLVMDIBuilderCreateLocalVariable(
DIBuilderRef Builder,
unsigned Tag,

View File

@ -586,6 +586,7 @@ LLVMDIBuilderCreate
LLVMDIBuilderDispose
LLVMDIBuilderFinalize
LLVMDIBuilderCreateCompileUnit
LLVMDIBuilderCreateStaticVariable
LLVMDIBuilderCreateLocalVariable
LLVMDIBuilderCreateFunction
LLVMDIBuilderCreateFile

View File

@ -0,0 +1,68 @@
// Copyright 2013-2014 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-android: FIXME(#10381)
// compile-flags:-g
// debugger:rbreak zzz
// debugger:run
// debugger:finish
// debugger:whatis 'basic-types-globals-metadata::B'
// check:type = bool
// debugger:whatis 'basic-types-globals-metadata::I'
// check:type = int
// debugger:whatis 'basic-types-globals-metadata::C'
// check:type = char
// debugger:whatis 'basic-types-globals-metadata::I8'
// check:type = i8
// debugger:whatis 'basic-types-globals-metadata::I16'
// check:type = i16
// debugger:whatis 'basic-types-globals-metadata::I32'
// check:type = i32
// debugger:whatis 'basic-types-globals-metadata::I64'
// check:type = i64
// debugger:whatis 'basic-types-globals-metadata::U'
// check:type = uint
// debugger:whatis 'basic-types-globals-metadata::U8'
// check:type = u8
// debugger:whatis 'basic-types-globals-metadata::U16'
// check:type = u16
// debugger:whatis 'basic-types-globals-metadata::U32'
// check:type = u32
// debugger:whatis 'basic-types-globals-metadata::U64'
// check:type = u64
// debugger:whatis 'basic-types-globals-metadata::F32'
// check:type = f32
// debugger:whatis 'basic-types-globals-metadata::F64'
// check:type = f64
// debugger:continue
#[allow(unused_variable)];
static B: bool = false;
static I: int = -1;
static C: char = 'a';
static I8: i8 = 68;
static I16: i16 = -16;
static I32: i32 = -32;
static I64: i64 = -64;
static U: uint = 1;
static U8: u8 = 100;
static U16: u16 = 16;
static U32: u32 = 32;
static U64: u64 = 64;
static F32: f32 = 2.5;
static F64: f64 = 3.5;
fn main() {
_zzz();
}
fn _zzz() {()}

View File

@ -0,0 +1,74 @@
// Copyright 2013-2014 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.
// Caveats - gdb prints any 8-bit value (meaning rust I8 and u8 values)
// as its numerical value along with its associated ASCII char, there
// doesn't seem to be any way around this. Also, gdb doesn't know
// about UTF-32 character encoding and will print a rust char as only
// its numerical value.
// ignore-android: FIXME(#10381)
// compile-flags:-g
// debugger:rbreak zzz
// debugger:run
// debugger:finish
// debugger:print 'basic-types-globals::B'
// check:$1 = false
// debugger:print 'basic-types-globals::I'
// check:$2 = -1
// debugger:print 'basic-types-globals::C'
// check:$3 = 97
// debugger:print/d 'basic-types-globals::I8'
// check:$4 = 68
// debugger:print 'basic-types-globals::I16'
// check:$5 = -16
// debugger:print 'basic-types-globals::I32'
// check:$6 = -32
// debugger:print 'basic-types-globals::I64'
// check:$7 = -64
// debugger:print 'basic-types-globals::U'
// check:$8 = 1
// debugger:print/d 'basic-types-globals::U8'
// check:$9 = 100
// debugger:print 'basic-types-globals::U16'
// check:$10 = 16
// debugger:print 'basic-types-globals::U32'
// check:$11 = 32
// debugger:print 'basic-types-globals::U64'
// check:$12 = 64
// debugger:print 'basic-types-globals::F32'
// check:$13 = 2.5
// debugger:print 'basic-types-globals::F64'
// check:$14 = 3.5
// debugger:continue
#[allow(unused_variable)];
static B: bool = false;
static I: int = -1;
static C: char = 'a';
static I8: i8 = 68;
static I16: i16 = -16;
static I32: i32 = -32;
static I64: i64 = -64;
static U: uint = 1;
static U8: u8 = 100;
static U16: u16 = 16;
static U32: u32 = 32;
static U64: u64 = 64;
static F32: f32 = 2.5;
static F64: f64 = 3.5;
fn main() {
_zzz();
}
fn _zzz() {()}

View File

@ -46,8 +46,7 @@
// check:type = f64
// debugger:info functions _yyy
// check:[...]![...]_yyy([...])([...]);
// debugger:detach
// debugger:quit
// debugger:continue
#[allow(unused_variable)];

View File

@ -0,0 +1,128 @@
// Copyright 2013-2014 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.
// Caveats - gdb prints any 8-bit value (meaning rust I8 and u8 values)
// as its numerical value along with its associated ASCII char, there
// doesn't seem to be any way around this. Also, gdb doesn't know
// about UTF-32 character encoding and will print a rust char as only
// its numerical value.
// ignore-android: FIXME(#10381)
// compile-flags:-g
// debugger:rbreak zzz
// debugger:run
// debugger:finish
// Check initializers
// debugger:print 'basic-types-mut-globals::B'
// check:$1 = false
// debugger:print 'basic-types-mut-globals::I'
// check:$2 = -1
// debugger:print 'basic-types-mut-globals::C'
// check:$3 = 97
// debugger:print/d 'basic-types-mut-globals::I8'
// check:$4 = 68
// debugger:print 'basic-types-mut-globals::I16'
// check:$5 = -16
// debugger:print 'basic-types-mut-globals::I32'
// check:$6 = -32
// debugger:print 'basic-types-mut-globals::I64'
// check:$7 = -64
// debugger:print 'basic-types-mut-globals::U'
// check:$8 = 1
// debugger:print/d 'basic-types-mut-globals::U8'
// check:$9 = 100
// debugger:print 'basic-types-mut-globals::U16'
// check:$10 = 16
// debugger:print 'basic-types-mut-globals::U32'
// check:$11 = 32
// debugger:print 'basic-types-mut-globals::U64'
// check:$12 = 64
// debugger:print 'basic-types-mut-globals::F32'
// check:$13 = 2.5
// debugger:print 'basic-types-mut-globals::F64'
// check:$14 = 3.5
// debugger:continue
// Check new values
// debugger:print 'basic-types-mut-globals'::B
// check:$15 = true
// debugger:print 'basic-types-mut-globals'::I
// check:$16 = 2
// debugger:print 'basic-types-mut-globals'::C
// check:$17 = 102
// debugger:print/d 'basic-types-mut-globals'::I8
// check:$18 = 78
// debugger:print 'basic-types-mut-globals'::I16
// check:$19 = -26
// debugger:print 'basic-types-mut-globals'::I32
// check:$20 = -12
// debugger:print 'basic-types-mut-globals'::I64
// check:$21 = -54
// debugger:print 'basic-types-mut-globals'::U
// check:$22 = 5
// debugger:print/d 'basic-types-mut-globals'::U8
// check:$23 = 20
// debugger:print 'basic-types-mut-globals'::U16
// check:$24 = 32
// debugger:print 'basic-types-mut-globals'::U32
// check:$25 = 16
// debugger:print 'basic-types-mut-globals'::U64
// check:$26 = 128
// debugger:print 'basic-types-mut-globals'::F32
// check:$27 = 5.75
// debugger:print 'basic-types-mut-globals'::F64
// check:$28 = 9.25
// debugger:detach
// debugger:quit
#[allow(unused_variable)];
static mut B: bool = false;
static mut I: int = -1;
static mut C: char = 'a';
static mut I8: i8 = 68;
static mut I16: i16 = -16;
static mut I32: i32 = -32;
static mut I64: i64 = -64;
static mut U: uint = 1;
static mut U8: u8 = 100;
static mut U16: u16 = 16;
static mut U32: u32 = 32;
static mut U64: u64 = 64;
static mut F32: f32 = 2.5;
static mut F64: f64 = 3.5;
fn main() {
_zzz();
unsafe {
B = true;
I = 2;
C = 'f';
I8 = 78;
I16 = -26;
I32 = -12;
I64 = -54;
U = 5;
U8 = 20;
U16 = 32;
U32 = 16;
U64 = 128;
F32 = 5.75;
F64 = 9.25;
}
_zzz();
}
fn _zzz() {()}

View File

@ -12,29 +12,63 @@
// compile-flags:-g
// debugger:rbreak zzz
// debugger:print 'c-style-enum::SINGLE_VARIANT'
// check:$1 = TheOnlyVariant
// debugger:print 'c-style-enum::AUTO_ONE'
// check:$2 = One
// debugger:print 'c-style-enum::AUTO_TWO'
// check:$3 = One
// debugger:print 'c-style-enum::AUTO_THREE'
// check:$4 = One
// debugger:print 'c-style-enum::MANUAL_ONE'
// check:$5 = OneHundred
// debugger:print 'c-style-enum::MANUAL_TWO'
// check:$6 = OneHundred
// debugger:print 'c-style-enum::MANUAL_THREE'
// check:$7 = OneHundred
// debugger:run
// debugger:finish
// debugger:print auto_one
// check:$1 = One
// check:$8 = One
// debugger:print auto_two
// check:$2 = Two
// check:$9 = Two
// debugger:print auto_three
// check:$3 = Three
// check:$10 = Three
// debugger:print manual_one_hundred
// check:$4 = OneHundred
// check:$11 = OneHundred
// debugger:print manual_one_thousand
// check:$5 = OneThousand
// check:$12 = OneThousand
// debugger:print manual_one_million
// check:$6 = OneMillion
// check:$13 = OneMillion
// debugger:print single_variant
// check:$7 = TheOnlyVariant
// check:$14 = TheOnlyVariant
// debugger:print 'c-style-enum::AUTO_TWO'
// check:$15 = Two
// debugger:print 'c-style-enum::AUTO_THREE'
// check:$16 = Three
// debugger:print 'c-style-enum::MANUAL_TWO'
// check:$17 = OneThousand
// debugger:print 'c-style-enum::MANUAL_THREE'
// check:$18 = OneMillion
#[allow(unused_variable)];
@ -54,6 +88,16 @@ enum SingleVariant {
TheOnlyVariant
}
static SINGLE_VARIANT: SingleVariant = TheOnlyVariant;
static mut AUTO_ONE: AutoDiscriminant = One;
static mut AUTO_TWO: AutoDiscriminant = One;
static mut AUTO_THREE: AutoDiscriminant = One;
static mut MANUAL_ONE: ManualDiscriminant = OneHundred;
static mut MANUAL_TWO: ManualDiscriminant = OneHundred;
static mut MANUAL_THREE: ManualDiscriminant = OneHundred;
fn main() {
let auto_one = One;
@ -66,6 +110,14 @@ fn main() {
let single_variant = TheOnlyVariant;
unsafe {
AUTO_TWO = Two;
AUTO_THREE = Three;
MANUAL_TWO = OneThousand;
MANUAL_THREE = OneMillion;
};
zzz();
}

View File

@ -15,29 +15,26 @@
// debugger:rbreak zzz
// debugger:run
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$1 = 0
// STRUCT EXPRESSION
// debugger:finish
// debugger:print val
// check:$1 = -1
// check:$2 = -1
// debugger:print ten
// check:$2 = 10
// check:$3 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$3 = 11
// debugger:print ten
// check:$4 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$5 = -1
// check:$4 = 11
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$5 = 1
// debugger:print ten
// check:$6 = 10
// debugger:continue
// FUNCTION CALL
// debugger:finish
// debugger:print val
// check:$7 = -1
@ -45,57 +42,55 @@
// check:$8 = 10
// debugger:continue
// FUNCTION CALL
// debugger:finish
// debugger:print val
// check:$9 = 12
// check:$9 = -1
// debugger:print ten
// check:$10 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$11 = -1
// check:$11 = 12
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$12 = 2
// debugger:print ten
// check:$12 = 10
// check:$13 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$14 = -1
// debugger:print ten
// check:$15 = 10
// debugger:continue
// TUPLE EXPRESSION
// debugger:finish
// debugger:print val
// check:$13 = -1
// check:$16 = -1
// debugger:print ten
// check:$14 = 10
// check:$17 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$15 = 13
// debugger:print ten
// check:$16 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$17 = -1
// debugger:print ten
// check:$18 = 10
// debugger:continue
// VEC EXPRESSION
// debugger:finish
// debugger:print val
// check:$19 = -1
// check:$18 = 13
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$19 = 3
// debugger:print ten
// check:$20 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$21 = 14
// check:$21 = -1
// debugger:print ten
// check:$22 = 10
// debugger:continue
// VEC EXPRESSION
// debugger:finish
// debugger:print val
// check:$23 = -1
@ -103,39 +98,35 @@
// check:$24 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$25 = 14
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$26 = 4
// debugger:print ten
// check:$27 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$28 = -1
// debugger:print ten
// check:$29 = 10
// debugger:continue
// REPEAT VEC EXPRESSION
// debugger:finish
// debugger:print val
// check:$25 = -1
// check:$30 = -1
// debugger:print ten
// check:$26 = 10
// check:$31 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$27 = 15
// debugger:print ten
// check:$28 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$29 = -1
// debugger:print ten
// check:$30 = 10
// debugger:continue
// ASSIGNMENT EXPRESSION
// debugger:finish
// debugger:print val
// check:$31 = -1
// debugger:print ten
// check:$32 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$33 = 16
// check:$32 = 15
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$33 = 5
// debugger:print ten
// check:$34 = 10
// debugger:continue
@ -147,8 +138,7 @@
// check:$36 = 10
// debugger:continue
// ARITHMETIC EXPRESSION
// ASSIGNMENT EXPRESSION
// debugger:finish
// debugger:print val
// check:$37 = -1
@ -158,40 +148,74 @@
// debugger:finish
// debugger:print val
// check:$39 = 17
// check:$39 = 16
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$40 = 6
// debugger:print ten
// check:$40 = 10
// check:$41 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$41 = -1
// check:$42 = -1
// debugger:print ten
// check:$42 = 10
// check:$43 = 10
// debugger:continue
// ARITHMETIC EXPRESSION
// debugger:finish
// debugger:print val
// check:$44 = -1
// debugger:print ten
// check:$45 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$46 = 17
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$47 = 7
// debugger:print ten
// check:$48 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$49 = -1
// debugger:print ten
// check:$50 = 10
// debugger:continue
// INDEX EXPRESSION
// debugger:finish
// debugger:print val
// check:$43 = -1
// check:$51 = -1
// debugger:print ten
// check:$44 = 10
// check:$52 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$45 = 18
// check:$53 = 18
// debugger:print 'lexical-scopes-in-block-expression::MUT_INT'
// check:$54 = 8
// debugger:print ten
// check:$46 = 10
// check:$55 = 10
// debugger:continue
// debugger:finish
// debugger:print val
// check:$47 = -1
// check:$56 = -1
// debugger:print ten
// check:$48 = 10
// check:$57 = 10
// debugger:continue
#[allow(unused_variable)];
#[allow(dead_assignment)];
static mut MUT_INT: int = 0;
struct Point {
x: int,
y: int
@ -213,6 +237,7 @@ fn main() {
sentinel();
let val = ten + 1;
unsafe {MUT_INT = 1;};
zzz();
sentinel();
@ -231,6 +256,7 @@ fn main() {
sentinel();
let val = ten + 2;
unsafe {MUT_INT = 2;};
zzz();
sentinel();
@ -248,6 +274,7 @@ fn main() {
sentinel();
let val = ten + 3;
unsafe {MUT_INT = 3;};
zzz();
sentinel();
@ -264,6 +291,7 @@ fn main() {
sentinel();
let val = ten + 4;
unsafe {MUT_INT = 4;};
zzz();
sentinel();
@ -280,6 +308,7 @@ fn main() {
sentinel();
let val = ten + 5;
unsafe {MUT_INT = 5;};
zzz();
sentinel();
@ -297,6 +326,7 @@ fn main() {
sentinel();
let val = ten + 6;
unsafe {MUT_INT = 6;};
zzz();
sentinel();
@ -313,6 +343,7 @@ fn main() {
sentinel();
let val = ten + 7;
unsafe {MUT_INT = 7;};
zzz();
sentinel();
@ -330,6 +361,7 @@ fn main() {
sentinel();
let val = ten + 8;
unsafe {MUT_INT = 8;};
zzz();
sentinel();

View File

@ -13,28 +13,66 @@
// compile-flags:-g
// debugger:set print pretty off
// debugger:rbreak zzz
// debugger:print 'simple-struct::NO_PADDING_16'
// check:$1 = {x = 1000, y = -1001}
// debugger:print 'simple-struct::NO_PADDING_32'
// check:$2 = {x = 1, y = 2, z = 3}
// debugger:print 'simple-struct::NO_PADDING_64'
// check:$3 = {x = 4, y = 5, z = 6}
// debugger:print 'simple-struct::NO_PADDING_163264'
// check:$4 = {a = 7, b = 8, c = 9, d = 10}
// debugger:print 'simple-struct::INTERNAL_PADDING'
// check:$5 = {x = 11, y = 12}
// debugger:print 'simple-struct::PADDING_AT_END'
// check:$6 = {x = 13, y = 14}
// debugger:run
// debugger:finish
// debugger:print no_padding16
// check:$1 = {x = 10000, y = -10001}
// check:$7 = {x = 10000, y = -10001}
// debugger:print no_padding32
// check:$2 = {x = -10002, y = -10003.5, z = 10004}
// check:$8 = {x = -10002, y = -10003.5, z = 10004}
// debugger:print no_padding64
// check:$3 = {x = -10005.5, y = 10006, z = 10007}
// check:$9 = {x = -10005.5, y = 10006, z = 10007}
// debugger:print no_padding163264
// check:$4 = {a = -10008, b = 10009, c = 10010, d = 10011}
// check:$10 = {a = -10008, b = 10009, c = 10010, d = 10011}
// debugger:print internal_padding
// check:$5 = {x = 10012, y = -10013}
// check:$11 = {x = 10012, y = -10013}
// debugger:print padding_at_end
// check:$6 = {x = -10014, y = 10015}
// check:$12 = {x = -10014, y = 10015}
// debugger:print 'simple-struct::NO_PADDING_16'
// check:$13 = {x = 100, y = -101}
// debugger:print 'simple-struct::NO_PADDING_32'
// check:$14 = {x = -15, y = -16, z = 17}
// debugger:print 'simple-struct::NO_PADDING_64'
// check:$15 = {x = -18, y = 19, z = 20}
// debugger:print 'simple-struct::NO_PADDING_163264'
// check:$16 = {a = -21, b = 22, c = 23, d = 24}
// debugger:print 'simple-struct::INTERNAL_PADDING'
// check:$17 = {x = 25, y = -26}
// debugger:print 'simple-struct::PADDING_AT_END'
// check:$18 = {x = -27, y = 28}
#[allow(unused_variable)];
#[allow(dead_code)];
struct NoPadding16 {
x: u16,
@ -70,6 +108,40 @@ struct PaddingAtEnd {
y: u16
}
static mut NO_PADDING_16: NoPadding16 = NoPadding16 {
x: 1000,
y: -1001
};
static mut NO_PADDING_32: NoPadding32 = NoPadding32 {
x: 1,
y: 2.0,
z: 3
};
static mut NO_PADDING_64: NoPadding64 = NoPadding64 {
x: 4.0,
y: 5,
z: 6
};
static mut NO_PADDING_163264: NoPadding163264 = NoPadding163264 {
a: 7,
b: 8,
c: 9,
d: 10
};
static mut INTERNAL_PADDING: InternalPadding = InternalPadding {
x: 11,
y: 12
};
static mut PADDING_AT_END: PaddingAtEnd = PaddingAtEnd {
x: 13,
y: 14
};
fn main() {
let no_padding16 = NoPadding16 { x: 10000, y: -10001 };
let no_padding32 = NoPadding32 { x: -10002, y: -10003.5, z: 10004 };
@ -79,6 +151,30 @@ fn main() {
let internal_padding = InternalPadding { x: 10012, y: -10013 };
let padding_at_end = PaddingAtEnd { x: -10014, y: 10015 };
unsafe {
NO_PADDING_16.x = 100;
NO_PADDING_16.y = -101;
NO_PADDING_32.x = -15;
NO_PADDING_32.y = -16.0;
NO_PADDING_32.z = 17;
NO_PADDING_64.x = -18.0;
NO_PADDING_64.y = 19;
NO_PADDING_64.z = 20;
NO_PADDING_163264.a = -21;
NO_PADDING_163264.b = 22;
NO_PADDING_163264.c = 23;
NO_PADDING_163264.d = 24;
INTERNAL_PADDING.x = 25;
INTERNAL_PADDING.y = -26;
PADDING_AT_END.x = -27;
PADDING_AT_END.y = 28;
}
zzz();
}

View File

@ -13,27 +13,74 @@
// compile-flags:-g
// debugger:set print pretty off
// debugger:rbreak zzz
// debugger:print/d 'simple-tuple::NO_PADDING_8'
// check:$1 = {-50, 50}
// debugger:print 'simple-tuple::NO_PADDING_16'
// check:$2 = {-1, 2, 3}
// debugger:print 'simple-tuple::NO_PADDING_32'
// check:$3 = {4, 5, 6}
// debugger:print 'simple-tuple::NO_PADDING_64'
// check:$4 = {7, 8, 9}
// debugger:print 'simple-tuple::INTERNAL_PADDING_1'
// check:$5 = {10, 11}
// debugger:print 'simple-tuple::INTERNAL_PADDING_2'
// check:$6 = {12, 13, 14, 15}
// debugger:print 'simple-tuple::PADDING_AT_END'
// check:$7 = {16, 17}
// debugger:run
// debugger:finish
// debugger:print/d noPadding8
// check:$1 = {-100, 100}
// check:$8 = {-100, 100}
// debugger:print noPadding16
// check:$2 = {0, 1, 2}
// check:$9 = {0, 1, 2}
// debugger:print noPadding32
// check:$3 = {3, 4.5, 5}
// check:$10 = {3, 4.5, 5}
// debugger:print noPadding64
// check:$4 = {6, 7.5, 8}
// check:$11 = {6, 7.5, 8}
// debugger:print internalPadding1
// check:$5 = {9, 10}
// check:$12 = {9, 10}
// debugger:print internalPadding2
// check:$6 = {11, 12, 13, 14}
// check:$13 = {11, 12, 13, 14}
// debugger:print paddingAtEnd
// check:$7 = {15, 16}
// check:$14 = {15, 16}
// debugger:print/d 'simple-tuple::NO_PADDING_8'
// check:$15 = {-127, 127}
// debugger:print 'simple-tuple::NO_PADDING_16'
// check:$16 = {-10, 10, 9}
// debugger:print 'simple-tuple::NO_PADDING_32'
// check:$17 = {14, 15, 16}
// debugger:print 'simple-tuple::NO_PADDING_64'
// check:$18 = {17, 18, 19}
// debugger:print 'simple-tuple::INTERNAL_PADDING_1'
// check:$19 = {110, 111}
// debugger:print 'simple-tuple::INTERNAL_PADDING_2'
// check:$20 = {112, 113, 114, 115}
// debugger:print 'simple-tuple::PADDING_AT_END'
// check:$21 = {116, 117}
#[allow(unused_variable)];
#[allow(dead_code)];
static mut NO_PADDING_8: (i8, u8) = (-50, 50);
static mut NO_PADDING_16: (i16, i16, u16) = (-1, 2, 3);
static mut NO_PADDING_32: (i32, f32, u32) = (4, 5.0, 6);
static mut NO_PADDING_64: (i64, f64, u64) = (7, 8.0, 9);
static mut INTERNAL_PADDING_1: (i16, i32) = (10, 11);
static mut INTERNAL_PADDING_2: (i16, i32, u32, u64) = (12, 13, 14, 15);
static mut PADDING_AT_END: (i32, i16) = (16, 17);
fn main() {
let noPadding8: (i8, u8) = (-100, 100);
@ -46,6 +93,19 @@ fn main() {
let paddingAtEnd: (i32, i16) = (15, 16);
unsafe {
NO_PADDING_8 = (-127, 127);
NO_PADDING_16 = (-10, 10, 9);
NO_PADDING_32 = (14, 15.0, 16);
NO_PADDING_64 = (17, 18.0, 19);
INTERNAL_PADDING_1 = (110, 111);
INTERNAL_PADDING_2 = (112, 113, 114, 115);
PADDING_AT_END = (116, 117);
}
zzz();
}

View File

@ -47,6 +47,11 @@
// debugger:print padded_struct.data_ptr[1]
// check:$13 = {x = 13, y = 14, z = 15}
// debugger:print 'vec-slices::MUT_VECT_SLICE'.length
// check:$14 = 2
// debugger:print *((int64_t[2]*)('vec-slices::MUT_VECT_SLICE'.data_ptr))
// check:$15 = {64, 65}
#[allow(unused_variable)];
struct AStruct {
@ -55,6 +60,9 @@ struct AStruct {
z: i16
}
static VECT_SLICE: &'static [i64] = &[64, 65];
static mut MUT_VECT_SLICE: &'static [i64] = &[32];
fn main() {
let empty: &[i64] = &[];
let singleton: &[i64] = &[1];
@ -68,6 +76,10 @@ fn main() {
AStruct { x: 13, y: 14, z: 15 }
];
unsafe {
MUT_VECT_SLICE = VECT_SLICE;
}
zzz();
}

View File

@ -17,12 +17,22 @@
// debugger:finish
// debugger:print a
// check:$1 = {1, 2, 3}
// debugger:print vec::VECT
// check:$2 = {4, 5, 6}
#[allow(unused_variable)];
static mut VECT: [i32, ..3] = [1, 2, 3];
fn main() {
let a = [1, 2, 3];
unsafe {
VECT[0] = 4;
VECT[1] = 5;
VECT[2] = 6;
}
zzz();
}