debuginfo: Add a "no_debug" attribute that allows to exclude functions from debuginfo generation.
This commit is contained in:
parent
1d12b6d444
commit
910dd2635c
src
@ -578,6 +578,7 @@ impl LintPass for UnusedAttribute {
|
||||
"packed",
|
||||
"static_assert",
|
||||
"thread_local",
|
||||
"no_debug",
|
||||
|
||||
// not used anywhere (!?) but apparently we want to keep them around
|
||||
"comment",
|
||||
|
@ -1128,6 +1128,10 @@ pub fn create_function_debug_context(cx: &CrateContext,
|
||||
|
||||
let (ident, fn_decl, generics, top_level_block, span, has_path) = match fnitem {
|
||||
ast_map::NodeItem(ref item) => {
|
||||
if contains_nodebug_attribute(item.attrs.as_slice()) {
|
||||
return FunctionDebugContext { repr: FunctionWithoutDebugInfo };
|
||||
}
|
||||
|
||||
match item.node {
|
||||
ast::ItemFn(fn_decl, _, _, ref generics, top_level_block) => {
|
||||
(item.ident, fn_decl, generics, top_level_block, item.span, true)
|
||||
@ -1141,6 +1145,12 @@ pub fn create_function_debug_context(cx: &CrateContext,
|
||||
ast_map::NodeImplItem(ref item) => {
|
||||
match **item {
|
||||
ast::MethodImplItem(ref method) => {
|
||||
if contains_nodebug_attribute(method.attrs.as_slice()) {
|
||||
return FunctionDebugContext {
|
||||
repr: FunctionWithoutDebugInfo
|
||||
};
|
||||
}
|
||||
|
||||
(method.pe_ident(),
|
||||
method.pe_fn_decl(),
|
||||
method.pe_generics(),
|
||||
@ -1173,6 +1183,12 @@ pub fn create_function_debug_context(cx: &CrateContext,
|
||||
ast_map::NodeTraitItem(ref trait_method) => {
|
||||
match **trait_method {
|
||||
ast::ProvidedMethod(ref method) => {
|
||||
if contains_nodebug_attribute(method.attrs.as_slice()) {
|
||||
return FunctionDebugContext {
|
||||
repr: FunctionWithoutDebugInfo
|
||||
};
|
||||
}
|
||||
|
||||
(method.pe_ident(),
|
||||
method.pe_fn_decl(),
|
||||
method.pe_generics(),
|
||||
@ -3169,6 +3185,16 @@ fn set_debug_location(cx: &CrateContext, debug_location: DebugLocation) {
|
||||
// Utility Functions
|
||||
//=-----------------------------------------------------------------------------
|
||||
|
||||
fn contains_nodebug_attribute(attributes: &[ast::Attribute]) -> bool {
|
||||
attributes.iter().any(|attr| {
|
||||
let meta_item: &ast::MetaItem = &*attr.node.value;
|
||||
match meta_item.node {
|
||||
ast::MetaWord(ref value) => value.get() == "no_debug",
|
||||
_ => false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// Return codemap::Loc corresponding to the beginning of the span
|
||||
fn span_start(cx: &CrateContext, span: Span) -> codemap::Loc {
|
||||
cx.sess().codemap().lookup_char_pos(span.lo)
|
||||
|
45
src/test/debuginfo/no-debug-attribute.rs
Normal file
45
src/test/debuginfo/no-debug-attribute.rs
Normal file
@ -0,0 +1,45 @@
|
||||
// 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)
|
||||
// ignore-lldb
|
||||
|
||||
// compile-flags:-g
|
||||
|
||||
// gdb-command:break 'no-debug-attribute.rs':32
|
||||
// gdb-command:break 'no-debug-attribute.rs':38
|
||||
// gdb-command:run
|
||||
|
||||
// gdb-command:info locals
|
||||
// gdb-check:No locals.
|
||||
// gdb-command:continue
|
||||
|
||||
// gdb-command:info locals
|
||||
// gdb-check:abc = 10
|
||||
// gdb-command:continue
|
||||
|
||||
#![allow(unused_variable)]
|
||||
|
||||
fn function_with_debuginfo() {
|
||||
let abc = 10u;
|
||||
return (); // #break
|
||||
}
|
||||
|
||||
#[no_debug]
|
||||
fn function_without_debuginfo() {
|
||||
let abc = -57i32;
|
||||
return (); // #break
|
||||
}
|
||||
|
||||
fn main() {
|
||||
function_without_debuginfo();
|
||||
function_with_debuginfo();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user