3 use clippy_utils::diagnostics::span_lint_and_help;
4 use rustc_ast::ast::{Expr, ExprKind, InlineAsmOptions};
5 use rustc_lint::{EarlyContext, EarlyLintPass, Lint};
6 use rustc_session::{declare_lint_pass, declare_tool_lint};
8 #[derive(Clone, Copy, PartialEq, Eq)]
14 impl fmt::Display for AsmStyle {
15 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17 AsmStyle::Intel => f.write_str("Intel"),
18 AsmStyle::Att => f.write_str("AT&T"),
23 impl std::ops::Not for AsmStyle {
24 type Output = AsmStyle;
26 fn not(self) -> AsmStyle {
28 AsmStyle::Intel => AsmStyle::Att,
29 AsmStyle::Att => AsmStyle::Intel,
34 fn check_expr_asm_syntax(lint: &'static Lint, cx: &EarlyContext<'_>, expr: &Expr, check_for: AsmStyle) {
35 if let ExprKind::InlineAsm(ref inline_asm) = expr.kind {
36 let style = if inline_asm.options.contains(InlineAsmOptions::ATT_SYNTAX) {
42 if style == check_for {
47 &format!("{style} x86 assembly syntax used"),
49 &format!("use {} x86 assembly syntax", !style),
55 declare_clippy_lint! {
57 /// Checks for usage of Intel x86 assembly syntax.
59 /// ### Why is this bad?
60 /// The lint has been enabled to indicate a preference
61 /// for AT&T x86 assembly syntax.
66 /// # #![feature(asm)]
67 /// # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
68 /// # unsafe { let ptr = "".as_ptr();
69 /// # use std::arch::asm;
70 /// asm!("lea {}, [{}]", lateout(reg) _, in(reg) ptr);
75 /// # #![feature(asm)]
76 /// # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
77 /// # unsafe { let ptr = "".as_ptr();
78 /// # use std::arch::asm;
79 /// asm!("lea ({}), {}", in(reg) ptr, lateout(reg) _, options(att_syntax));
82 #[clippy::version = "1.49.0"]
83 pub INLINE_ASM_X86_INTEL_SYNTAX,
85 "prefer AT&T x86 assembly syntax"
88 declare_lint_pass!(InlineAsmX86IntelSyntax => [INLINE_ASM_X86_INTEL_SYNTAX]);
90 impl EarlyLintPass for InlineAsmX86IntelSyntax {
91 fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
92 check_expr_asm_syntax(Self::get_lints()[0], cx, expr, AsmStyle::Intel);
96 declare_clippy_lint! {
98 /// Checks for usage of AT&T x86 assembly syntax.
100 /// ### Why is this bad?
101 /// The lint has been enabled to indicate a preference
102 /// for Intel x86 assembly syntax.
107 /// # #![feature(asm)]
108 /// # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
109 /// # unsafe { let ptr = "".as_ptr();
110 /// # use std::arch::asm;
111 /// asm!("lea ({}), {}", in(reg) ptr, lateout(reg) _, options(att_syntax));
116 /// # #![feature(asm)]
117 /// # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
118 /// # unsafe { let ptr = "".as_ptr();
119 /// # use std::arch::asm;
120 /// asm!("lea {}, [{}]", lateout(reg) _, in(reg) ptr);
123 #[clippy::version = "1.49.0"]
124 pub INLINE_ASM_X86_ATT_SYNTAX,
126 "prefer Intel x86 assembly syntax"
129 declare_lint_pass!(InlineAsmX86AttSyntax => [INLINE_ASM_X86_ATT_SYNTAX]);
131 impl EarlyLintPass for InlineAsmX86AttSyntax {
132 fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
133 check_expr_asm_syntax(Self::get_lints()[0], cx, expr, AsmStyle::Att);