From b40dc30a3ea218caae39052eb0ef57fb15493072 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 30 Dec 2019 21:35:13 -0800 Subject: [PATCH] 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. --- src/librustc_codegen_llvm/attributes.rs | 21 +++++++++++++++------ src/test/codegen/force-frame-pointers.rs | 4 ++-- src/test/codegen/instrument-mcount.rs | 3 ++- 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() {} -- GitLab