diff options
| author | Fangrui Song <i@maskray.me> | 2019-12-30 21:35:13 -0800 |
|---|---|---|
| committer | Fangrui Song <i@maskray.me> | 2019-12-30 23:16:02 -0800 |
| commit | b40dc30a3ea218caae39052eb0ef57fb15493072 (patch) | |
| tree | 43f9f4d4a502c0bf7cc24866e545207aa71a2be9 | |
| parent | a9dd56ff9a08d74c53d5cc22d18f126a12749608 (diff) | |
| download | rust-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.rs | 21 | ||||
| -rw-r--r-- | src/test/codegen/force-frame-pointers.rs | 4 | ||||
| -rw-r--r-- | 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() {} |
