Skip to content

Commit

Permalink
Ensure ASM syntax detect global_asm! and asm! only on x86 archite…
Browse files Browse the repository at this point in the history
…ctures
  • Loading branch information
beetrees committed Feb 17, 2024
1 parent 3b36b37 commit 9b5e4c6
Show file tree
Hide file tree
Showing 6 changed files with 219 additions and 57 deletions.
37 changes: 31 additions & 6 deletions clippy_lints/src/asm_syntax.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ use std::fmt;

use clippy_utils::diagnostics::span_lint_and_help;
use rustc_ast::ast::{Expr, ExprKind, InlineAsmOptions};
use rustc_lint::{EarlyContext, EarlyLintPass, Lint};
use rustc_ast::{InlineAsm, Item, ItemKind};
use rustc_lint::{EarlyContext, EarlyLintPass, Lint, LintContext};
use rustc_session::declare_lint_pass;
use rustc_span::Span;
use rustc_target::asm::InlineAsmArch;

#[derive(Clone, Copy, PartialEq, Eq)]
enum AsmStyle {
Expand Down Expand Up @@ -31,8 +34,14 @@ impl std::ops::Not for AsmStyle {
}
}

fn check_expr_asm_syntax(lint: &'static Lint, cx: &EarlyContext<'_>, expr: &Expr, check_for: AsmStyle) {
if let ExprKind::InlineAsm(ref inline_asm) = expr.kind {
fn check_asm_syntax(
lint: &'static Lint,
cx: &EarlyContext<'_>,
inline_asm: &InlineAsm,
span: Span,
check_for: AsmStyle,
) {
if matches!(cx.sess().asm_arch, Some(InlineAsmArch::X86 | InlineAsmArch::X86_64)) {
let style = if inline_asm.options.contains(InlineAsmOptions::ATT_SYNTAX) {
AsmStyle::Att
} else {
Expand All @@ -43,7 +52,7 @@ fn check_expr_asm_syntax(lint: &'static Lint, cx: &EarlyContext<'_>, expr: &Expr
span_lint_and_help(
cx,
lint,
expr.span,
span,
&format!("{style} x86 assembly syntax used"),
None,
&format!("use {} x86 assembly syntax", !style),
Expand Down Expand Up @@ -89,7 +98,15 @@ declare_lint_pass!(InlineAsmX86IntelSyntax => [INLINE_ASM_X86_INTEL_SYNTAX]);

impl EarlyLintPass for InlineAsmX86IntelSyntax {
fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
check_expr_asm_syntax(Self::get_lints()[0], cx, expr, AsmStyle::Intel);
if let ExprKind::InlineAsm(inline_asm) = &expr.kind {
check_asm_syntax(Self::get_lints()[0], cx, inline_asm, expr.span, AsmStyle::Intel);
}
}

fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
if let ItemKind::GlobalAsm(inline_asm) = &item.kind {
check_asm_syntax(Self::get_lints()[0], cx, inline_asm, item.span, AsmStyle::Intel);
}
}
}

Expand Down Expand Up @@ -130,6 +147,14 @@ declare_lint_pass!(InlineAsmX86AttSyntax => [INLINE_ASM_X86_ATT_SYNTAX]);

impl EarlyLintPass for InlineAsmX86AttSyntax {
fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
check_expr_asm_syntax(Self::get_lints()[0], cx, expr, AsmStyle::Att);
if let ExprKind::InlineAsm(inline_asm) = &expr.kind {
check_asm_syntax(Self::get_lints()[0], cx, inline_asm, expr.span, AsmStyle::Att);
}
}

fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
if let ItemKind::GlobalAsm(inline_asm) = &item.kind {
check_asm_syntax(Self::get_lints()[0], cx, inline_asm, item.span, AsmStyle::Att);
}
}
}
46 changes: 0 additions & 46 deletions tests/ui/asm_syntax.stderr

This file was deleted.

24 changes: 24 additions & 0 deletions tests/ui/asm_syntax_not_x86.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//@ignore-target-i686
//@ignore-target-x86
//@needs-asm-support

#[warn(clippy::inline_asm_x86_intel_syntax)]
#[warn(clippy::inline_asm_x86_att_syntax)]
mod dont_warn {
use std::arch::{asm, global_asm};

pub(super) unsafe fn use_asm() {
asm!("");
asm!("", options());
asm!("", options(nostack));
}

global_asm!("");
global_asm!("", options());
}

fn main() {
unsafe {
dont_warn::use_asm();
}
}
73 changes: 73 additions & 0 deletions tests/ui/asm_syntax_x86.i686.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:10:9
|
LL | asm!("");
| ^^^^^^^^
|
= help: use AT&T x86 assembly syntax
= note: `-D clippy::inline-asm-x86-intel-syntax` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::inline_asm_x86_intel_syntax)]`

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:12:9
|
LL | asm!("", options());
| ^^^^^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:14:9
|
LL | asm!("", options(nostack));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:20:5
|
LL | global_asm!("");
| ^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax
= note: this error originates in the macro `global_asm` (in Nightly builds, run with -Z macro-backtrace for more info)

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:22:5
|
LL | global_asm!("", options());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax
= note: this error originates in the macro `global_asm` (in Nightly builds, run with -Z macro-backtrace for more info)

error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:35:9
|
LL | asm!("", options(att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use Intel x86 assembly syntax
= note: `-D clippy::inline-asm-x86-att-syntax` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::inline_asm_x86_att_syntax)]`

error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:37:9
|
LL | asm!("", options(nostack, att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use Intel x86 assembly syntax

error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:43:5
|
LL | global_asm!("", options(att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use Intel x86 assembly syntax
= note: this error originates in the macro `global_asm` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 8 previous errors

23 changes: 18 additions & 5 deletions tests/ui/asm_syntax.rs → tests/ui/asm_syntax_x86.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
//@only-target-x86_64
//@ignore-target-aarch64
//@revisions: i686 x86_64
//@[i686] only-target-i686
//@[x86_64] only-target-x86_64

#[warn(clippy::inline_asm_x86_intel_syntax)]
mod warn_intel {
use std::arch::{asm, global_asm};

pub(super) unsafe fn use_asm() {
use std::arch::asm;
asm!("");
//~^ ERROR: Intel x86 assembly syntax used
asm!("", options());
Expand All @@ -14,12 +16,19 @@ mod warn_intel {
asm!("", options(att_syntax));
asm!("", options(nostack, att_syntax));
}

global_asm!("");
//~^ ERROR: Intel x86 assembly syntax used
global_asm!("", options());
//~^ ERROR: Intel x86 assembly syntax used
global_asm!("", options(att_syntax));
}

#[warn(clippy::inline_asm_x86_att_syntax)]
mod warn_att {
use std::arch::{asm, global_asm};

pub(super) unsafe fn use_asm() {
use std::arch::asm;
asm!("");
asm!("", options());
asm!("", options(nostack));
Expand All @@ -28,9 +37,13 @@ mod warn_att {
asm!("", options(nostack, att_syntax));
//~^ ERROR: AT&T x86 assembly syntax used
}

global_asm!("");
global_asm!("", options());
global_asm!("", options(att_syntax));
//~^ ERROR: AT&T x86 assembly syntax used
}

#[cfg(target_arch = "x86_64")]
fn main() {
unsafe {
warn_att::use_asm();
Expand Down
73 changes: 73 additions & 0 deletions tests/ui/asm_syntax_x86.x86_64.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:10:9
|
LL | asm!("");
| ^^^^^^^^
|
= help: use AT&T x86 assembly syntax
= note: `-D clippy::inline-asm-x86-intel-syntax` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::inline_asm_x86_intel_syntax)]`

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:12:9
|
LL | asm!("", options());
| ^^^^^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:14:9
|
LL | asm!("", options(nostack));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:20:5
|
LL | global_asm!("");
| ^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax
= note: this error originates in the macro `global_asm` (in Nightly builds, run with -Z macro-backtrace for more info)

error: Intel x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:22:5
|
LL | global_asm!("", options());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use AT&T x86 assembly syntax
= note: this error originates in the macro `global_asm` (in Nightly builds, run with -Z macro-backtrace for more info)

error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:35:9
|
LL | asm!("", options(att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use Intel x86 assembly syntax
= note: `-D clippy::inline-asm-x86-att-syntax` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::inline_asm_x86_att_syntax)]`

error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:37:9
|
LL | asm!("", options(nostack, att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use Intel x86 assembly syntax

error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax_x86.rs:43:5
|
LL | global_asm!("", options(att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: use Intel x86 assembly syntax
= note: this error originates in the macro `global_asm` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 8 previous errors

0 comments on commit 9b5e4c6

Please sign in to comment.