]> git.lizzy.rs Git - rust.git/commitdiff
debuginfo: Add a "no_debug" attribute that allows to exclude functions from debuginfo...
authorMichael Woerister <michaelwoerister@posteo>
Thu, 10 Jul 2014 15:01:11 +0000 (17:01 +0200)
committerMichael Woerister <michaelwoerister@posteo>
Fri, 15 Aug 2014 13:35:43 +0000 (15:35 +0200)
src/librustc/lint/builtin.rs
src/librustc/middle/trans/debuginfo.rs
src/test/debuginfo/no-debug-attribute.rs [new file with mode: 0644]

index d08e2ce527f1f60dd73ce03a28c1ee3bcb2f264c..f9c4e0fd769af19391c84d7f891d55559672c020 100644 (file)
@@ -578,6 +578,7 @@ fn check_attribute(&mut self, cx: &Context, attr: &ast::Attribute) {
             "packed",
             "static_assert",
             "thread_local",
+            "no_debug",
 
             // not used anywhere (!?) but apparently we want to keep them around
             "comment",
index de5e718206d909c68b03353fdd718c51000c0672..0c481b68f67fd5b24e42fd1a2ca917121b70c103 100644 (file)
@@ -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 (file)
index 0000000..e61ded4
--- /dev/null
@@ -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();
+}
+