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!("{} x86 assembly syntax used", style),
49 &format!("use {} x86 assembly syntax", !style),
55 declare_clippy_lint! {
56 /// **What it does:** Checks for usage of Intel x86 assembly syntax.
58 /// **Why is this bad?** The lint has been enabled to indicate a preference
59 /// for AT&T x86 assembly syntax.
61 /// **Known problems:** None.
66 /// # #![feature(asm)]
67 /// # unsafe { let ptr = "".as_ptr();
68 /// asm!("lea {}, [{}]", lateout(reg) _, in(reg) ptr);
73 /// # #![feature(asm)]
74 /// # unsafe { let ptr = "".as_ptr();
75 /// asm!("lea ({}), {}", in(reg) ptr, lateout(reg) _, options(att_syntax));
78 pub INLINE_ASM_X86_INTEL_SYNTAX,
80 "prefer AT&T x86 assembly syntax"
83 declare_lint_pass!(InlineAsmX86IntelSyntax => [INLINE_ASM_X86_INTEL_SYNTAX]);
85 impl EarlyLintPass for InlineAsmX86IntelSyntax {
86 fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
87 check_expr_asm_syntax(Self::get_lints()[0], cx, expr, AsmStyle::Intel);
91 declare_clippy_lint! {
92 /// **What it does:** Checks for usage of AT&T x86 assembly syntax.
94 /// **Why is this bad?** The lint has been enabled to indicate a preference
95 /// for Intel x86 assembly syntax.
97 /// **Known problems:** None.
102 /// # #![feature(asm)]
103 /// # unsafe { let ptr = "".as_ptr();
104 /// asm!("lea ({}), {}", in(reg) ptr, lateout(reg) _, options(att_syntax));
109 /// # #![feature(asm)]
110 /// # unsafe { let ptr = "".as_ptr();
111 /// asm!("lea {}, [{}]", lateout(reg) _, in(reg) ptr);
114 pub INLINE_ASM_X86_ATT_SYNTAX,
116 "prefer Intel x86 assembly syntax"
119 declare_lint_pass!(InlineAsmX86AttSyntax => [INLINE_ASM_X86_ATT_SYNTAX]);
121 impl EarlyLintPass for InlineAsmX86AttSyntax {
122 fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
123 check_expr_asm_syntax(Self::get_lints()[0], cx, expr, AsmStyle::Att);