about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2019-12-30 21:35:13 -0800
committerFangrui Song <i@maskray.me>2019-12-30 23:16:02 -0800
commitb40dc30a3ea218caae39052eb0ef57fb15493072 (patch)
tree43f9f4d4a502c0bf7cc24866e545207aa71a2be9
parenta9dd56ff9a08d74c53d5cc22d18f126a12749608 (diff)
downloadrust-b40dc30a3ea218caae39052eb0ef57fb15493072.tar.gz
rust-b40dc30a3ea218caae39052eb0ef57fb15493072.zip
Use function attribute "frame-pointer" instead of "no-frame-pointer-elim"
LLVM 8 (D56351) introduced "frame-pointer". In LLVM 10 (D71863),
"no-frame-pointer-elim"/"no-frame-pointer-elim-non-leaf" will be
ignored.
-rw-r--r--src/librustc_codegen_llvm/attributes.rs21
-rw-r--r--src/test/codegen/force-frame-pointers.rs4
-rw-r--r--src/test/codegen/instrument-mcount.rs3
3 files changed, 19 insertions, 9 deletions
diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index 816f5baddcb..942ba9f868c 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -66,12 +66,21 @@ fn naked(val: &'ll Value, is_naked: bool) {
 
 pub fn set_frame_pointer_elimination(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
     if cx.sess().must_not_eliminate_frame_pointers() {
-        llvm::AddFunctionAttrStringValue(
-            llfn,
-            llvm::AttributePlace::Function,
-            const_cstr!("no-frame-pointer-elim"),
-            const_cstr!("true"),
-        );
+        if llvm_util::get_major_version() >= 8 {
+            llvm::AddFunctionAttrStringValue(
+                llfn,
+                llvm::AttributePlace::Function,
+                const_cstr!("frame-pointer"),
+                const_cstr!("all"),
+            );
+        } else {
+            llvm::AddFunctionAttrStringValue(
+                llfn,
+                llvm::AttributePlace::Function,
+                const_cstr!("no-frame-pointer-elim"),
+                const_cstr!("true"),
+            );
+        }
     }
 }
 
diff --git a/src/test/codegen/force-frame-pointers.rs b/src/test/codegen/force-frame-pointers.rs
index c6c1da2c1b0..4c94a601f33 100644
--- a/src/test/codegen/force-frame-pointers.rs
+++ b/src/test/codegen/force-frame-pointers.rs
@@ -1,7 +1,7 @@
-//
+// min-llvm-version 8.0
 // compile-flags: -C no-prepopulate-passes -C force-frame-pointers=y
 
 #![crate_type="lib"]
 
-// CHECK: attributes #{{.*}} "no-frame-pointer-elim"="true"
+// CHECK: attributes #{{.*}} "frame-pointer"="all"
 pub fn foo() {}
diff --git a/src/test/codegen/instrument-mcount.rs b/src/test/codegen/instrument-mcount.rs
index c72d09f7a03..e4e6d5ca2b8 100644
--- a/src/test/codegen/instrument-mcount.rs
+++ b/src/test/codegen/instrument-mcount.rs
@@ -1,7 +1,8 @@
+// min-llvm-version 8.0
 // ignore-tidy-linelength
 // compile-flags: -Z instrument-mcount
 
 #![crate_type = "lib"]
 
-// CHECK: attributes #{{.*}} "instrument-function-entry-inlined"="{{.*}}mcount{{.*}}" "no-frame-pointer-elim"="true"
+// CHECK: attributes #{{.*}} "frame-pointer"="all" "instrument-function-entry-inlined"="{{.*}}mcount{{.*}}"
 pub fn foo() {}