Emit an error if -Z instrument-xray is not supported

This is somewhat important because LLVM enables the pass based on
target architecture, but support by the target OS also matters.

For example, XRay attributes are processed by codegen for macOS
targets, but Apple linker fails to process relocations in XRay
data sections, so the feature as a whole is not supported there
for the time being.
This commit is contained in:
Oleksii Lozovskyi 2022-10-02 10:55:35 +09:00
parent 8e49c84740
commit 3561dc948c
5 changed files with 25 additions and 0 deletions

View File

@ -25,6 +25,8 @@ session_profile_sample_use_file_does_not_exist = file `{$path}` passed to `-C pr
session_target_requires_unwind_tables = target requires unwind tables, they cannot be disabled with `-C force-unwind-tables=no` session_target_requires_unwind_tables = target requires unwind tables, they cannot be disabled with `-C force-unwind-tables=no`
session_instrumentation_not_supported = {$us} instrumentation is not supported for this target
session_sanitizer_not_supported = {$us} sanitizer is not supported for this target session_sanitizer_not_supported = {$us} sanitizer is not supported for this target
session_sanitizers_not_supported = {$us} sanitizers are not supported for this target session_sanitizers_not_supported = {$us} sanitizers are not supported for this target

View File

@ -71,6 +71,12 @@ pub struct ProfileSampleUseFileDoesNotExist<'a> {
#[diag(session_target_requires_unwind_tables)] #[diag(session_target_requires_unwind_tables)]
pub struct TargetRequiresUnwindTables; pub struct TargetRequiresUnwindTables;
#[derive(Diagnostic)]
#[diag(session_instrumentation_not_supported)]
pub struct InstrumentationNotSupported {
pub us: String,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(session_sanitizer_not_supported)] #[diag(session_sanitizer_not_supported)]
pub struct SanitizerNotSupported { pub struct SanitizerNotSupported {

View File

@ -1589,6 +1589,10 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
{ {
sess.emit_err(errors::SplitDebugInfoUnstablePlatform { debuginfo: sess.split_debuginfo() }); sess.emit_err(errors::SplitDebugInfoUnstablePlatform { debuginfo: sess.split_debuginfo() });
} }
if sess.opts.unstable_opts.instrument_xray.is_some() && !sess.target.options.supports_xray {
sess.emit_err(errors::InstrumentationNotSupported { us: "XRay".to_string() });
}
} }
/// Holds data on the current incremental compilation session, if there is one. /// Holds data on the current incremental compilation session, if there is one.

View File

@ -0,0 +1,9 @@
// Verifies that `-Z instrument-xray` cannot be used with unsupported targets,
//
// needs-llvm-components: x86
// compile-flags: -Z instrument-xray --target x86_64-apple-darwin
// error-pattern: error: XRay instrumentation is not supported for this target
#![feature(no_core)]
#![no_core]
#![no_main]

View File

@ -0,0 +1,4 @@
error: XRay instrumentation is not supported for this target
error: aborting due to previous error