From 910dd2635c0defac0f64cd62fe7a3f22dc41bdba Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Thu, 10 Jul 2014 17:01:11 +0200 Subject: [PATCH] debuginfo: Add a "no_debug" attribute that allows to exclude functions from debuginfo generation. --- src/librustc/lint/builtin.rs | 1 + src/librustc/middle/trans/debuginfo.rs | 26 ++++++++++++++ src/test/debuginfo/no-debug-attribute.rs | 45 ++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 src/test/debuginfo/no-debug-attribute.rs diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index d08e2ce527f1f..f9c4e0fd769af 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -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", diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs index de5e718206d90..0c481b68f67fd 100644 --- a/src/librustc/middle/trans/debuginfo.rs +++ b/src/librustc/middle/trans/debuginfo.rs @@ -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) diff --git a/src/test/debuginfo/no-debug-attribute.rs b/src/test/debuginfo/no-debug-attribute.rs new file mode 100644 index 0000000000000..e61ded4ee2659 --- /dev/null +++ b/src/test/debuginfo/no-debug-attribute.rs @@ -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 or the MIT license +// , 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(); +} +