about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Woerister <michaelwoerister@posteo>2014-07-10 17:01:11 +0200
committerMichael Woerister <michaelwoerister@posteo>2014-08-15 15:35:43 +0200
commit910dd2635c0defac0f64cd62fe7a3f22dc41bdba (patch)
tree2d4bb03813d58b8df4c3ab49fc27da5fe925428c
parent1d12b6d444ec083466020777be5bb9f19e9a6d3a (diff)
downloadrust-910dd2635c0defac0f64cd62fe7a3f22dc41bdba.tar.gz
rust-910dd2635c0defac0f64cd62fe7a3f22dc41bdba.zip
debuginfo: Add a "no_debug" attribute that allows to exclude functions from debuginfo generation.
-rw-r--r--src/librustc/lint/builtin.rs1
-rw-r--r--src/librustc/middle/trans/debuginfo.rs26
-rw-r--r--src/test/debuginfo/no-debug-attribute.rs45
3 files changed, 72 insertions, 0 deletions
diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs
index d08e2ce527f..f9c4e0fd769 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 de5e718206d..0c481b68f67 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 00000000000..e61ded4ee26
--- /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 <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();
+}
+