about summary refs log tree commit diff
path: root/src/test/codegen
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-03-23 03:49:02 -0700
committerbors <bors@rust-lang.org>2016-03-23 03:49:02 -0700
commit26cfc269a0ec6a7c895c38954e9701b62940df07 (patch)
tree5e4e1c349375ccddf8dce3be4e996915c26d7bee /src/test/codegen
parentd6af19b89c477708ed0f5341ab7a26f1764f1ffa (diff)
parent4869417b6187e16091bfd5e45e36c999c7d0b98f (diff)
downloadrust-26cfc269a0ec6a7c895c38954e9701b62940df07.tar.gz
rust-26cfc269a0ec6a7c895c38954e9701b62940df07.zip
Auto merge of #32410 - Ticki:master, r=eddyb
Add support for naked functions

See https://github.com/rust-lang/rfcs/pull/1201#issuecomment-199442239

This PR adds `#[naked]` for marking naked functions.
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/naked-functions.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/test/codegen/naked-functions.rs b/src/test/codegen/naked-functions.rs
new file mode 100644
index 00000000000..0a600f4acad
--- /dev/null
+++ b/src/test/codegen/naked-functions.rs
@@ -0,0 +1,69 @@
+// Copyright 2015 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-tidy-linelength
+
+// compile-flags: -C no-prepopulate-passes
+
+#![crate_type = "lib"]
+#![feature(naked_functions)]
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal void @naked_empty()
+#[no_mangle]
+#[naked]
+fn naked_empty() {
+    // CHECK: ret void
+}
+
+// CHECK: Function Attrs: naked uwtable
+#[no_mangle]
+#[naked]
+// CHECK-NEXT: define internal void @naked_with_args(i{{[0-9]+}})
+fn naked_with_args(a: isize) {
+    // CHECK: %a = alloca i{{[0-9]+}}
+    // CHECK: ret void
+}
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal i{{[0-9]+}} @naked_with_return()
+#[no_mangle]
+#[naked]
+fn naked_with_return() -> isize {
+    // CHECK: ret i{{[0-9]+}} 0
+    0
+}
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}})
+#[no_mangle]
+#[naked]
+fn naked_with_args_and_return(a: isize) -> isize {
+    // CHECK: %a = alloca i{{[0-9]+}}
+    // CHECK: ret i{{[0-9]+}} %{{[0-9]+}}
+    a
+}
+
+// CHECK: Function Attrs: naked uwtable
+// CHECK-NEXT: define internal void @naked_recursive()
+#[no_mangle]
+#[naked]
+fn naked_recursive() {
+    // CHECK: call void @naked_empty()
+    naked_empty();
+    // CHECK: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_return()
+    naked_with_args(
+        // CHECK: %{{[0-9]+}} = call i{{[0-9]+}} @naked_with_args_and_return(i{{[0-9]+}} %{{[0-9]+}})
+        naked_with_args_and_return(
+            // CHECK: call void @naked_with_args(i{{[0-9]+}} %{{[0-9]+}})
+            naked_with_return()
+        )
+    );
+}