[PATCH] [clang] add support for -W{no-,}inline-asm-syntax
Rafael EspĂndola
rafael.espindola at gmail.com
Thu Feb 20 07:20:16 PST 2014
You forgot ta attach a corresponding llvm patch?
On 20 February 2014 03:21, Saleem Abdulrasool <compnerd at compnerd.org> wrote:
> Hi rengolin, dwmw2,
>
> When the integrated assembler is in use, the compiler is able to validate inline
> assembly. However, in order to maintain compatibility with GCC (and
> expectations of user-code), inline assembly should not be validated. The Linux
> kernel, for example, relies on this behaviour to use the compiler as a
> preprocessor.
>
> If we are emitting an object file, then the assembly must obviously be parsed,
> and as such, assembly processing is only disabled when emitting an assembly
> file. It is possible to still perform the inline assembly validation (by means
> of parsing) by passing in the new -Winline-asm-syntax flag.
>
> -Wno-inline-asm-syntax is added for completeness (and can be useful if
> -Winline-asm-syntax is passed globally, but a single target needs to have it
> disabled as it follows the last specification wins paradigm).
>
> http://llvm-reviews.chandlerc.com/D2840
>
> Files:
> include/clang/Basic/DiagnosticOptions.def
> include/clang/Driver/Options.td
> lib/CodeGen/BackendUtil.cpp
> lib/Driver/Tools.cpp
> lib/Frontend/CompilerInvocation.cpp
> test/CodeGen/inline-asm-diagnostics.c
> test/Driver/inline-asm-syntax.cpp
>
> Index: include/clang/Basic/DiagnosticOptions.def
> ===================================================================
> --- include/clang/Basic/DiagnosticOptions.def
> +++ include/clang/Basic/DiagnosticOptions.def
> @@ -46,6 +46,7 @@
>
> SEMANTIC_DIAGOPT(IgnoreWarnings, 1, 0) /// -w
> DIAGOPT(NoRewriteMacros, 1, 0) /// -Wno-rewrite-macros
> +DIAGOPT(InlineASMSyntax, 1, 0) /// -finline-asm-syntax
> DIAGOPT(Pedantic, 1, 0) /// -pedantic
> DIAGOPT(PedanticErrors, 1, 0) /// -pedantic-errors
> DIAGOPT(ShowColumn, 1, 1) /// Show column number on diagnostics.
> Index: include/clang/Driver/Options.td
> ===================================================================
> --- include/clang/Driver/Options.td
> +++ include/clang/Driver/Options.td
> @@ -281,6 +281,10 @@
> MetaVarName<"<arg>">;
> def Wwrite_strings : Flag<["-"], "Wwrite-strings">, Group<W_Group>, Flags<[CC1Option]>;
> def Wno_write_strings : Flag<["-"], "Wno-write-strings">, Group<W_Group>, Flags<[CC1Option]>;
> +def Winline_asm_syntax : Flag<["-"], "Winline-asm-syntax">,
> + Group<CompileOnly_Group>, Flags<[DriverOption]>;
> +def Wno_inline_asm_syntax : Flag<["-"], "Wno-inline-asm-syntax">,
> + Group<CompileOnly_Group>, Flags<[DriverOption]>;
> def W_Joined : Joined<["-"], "W">, Group<W_Group>, Flags<[CC1Option, CoreOption]>,
> MetaVarName<"<warning>">, HelpText<"Enable the specified warning">;
> def Xanalyzer : Separate<["-"], "Xanalyzer">,
> @@ -467,6 +471,8 @@
> def : Flag<["-"], "fextended-identifiers">, Group<clang_ignored_f_Group>;
> def : Flag<["-"], "fno-extended-identifiers">, Group<f_Group>, Flags<[Unsupported]>;
> def fhosted : Flag<["-"], "fhosted">, Group<f_Group>;
> +def finline_asm_syntax : Flag<["-"], "finline-asm-syntax">, Group<f_clang_Group>,
> + Flags<[CC1Option]>;
> def ffast_math : Flag<["-"], "ffast-math">, Group<f_Group>, Flags<[CC1Option]>,
> HelpText<"Enable the *frontend*'s 'fast-math' mode. This has no effect on "
> "optimizations, but provides a preprocessor macro __FAST_MATH__ the "
> Index: lib/CodeGen/BackendUtil.cpp
> ===================================================================
> --- lib/CodeGen/BackendUtil.cpp
> +++ lib/CodeGen/BackendUtil.cpp
> @@ -96,7 +96,8 @@
> /// In this case, we allow this method to fail and not report an error.
> /// When MustCreateTM is used, we print an error if we are unable to load
> /// the requested target.
> - TargetMachine *CreateTargetMachine(bool MustCreateTM);
> + TargetMachine *CreateTargetMachine(bool MustCreateTM,
> + bool ValidateInlineAssembly);
>
> /// AddEmitPasses - Add passes necessary to emit assembly or LLVM IR.
> ///
> @@ -353,7 +354,8 @@
> PMBuilder.populateModulePassManager(*MPM);
> }
>
> -TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
> +TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM,
> + bool ValidateInlineAssembly) {
> // Create the TargetMachine for generating code.
> std::string Error;
> std::string Triple = TheModule->getTargetTriple();
> @@ -484,6 +486,7 @@
> Options.TrapFuncName = CodeGenOpts.TrapFuncName;
> Options.PositionIndependentExecutable = LangOpts.PIELevel != 0;
> Options.EnableSegmentedStacks = CodeGenOpts.EnableSegmentedStacks;
> + Options.ValidateInlineASMSyntax = ValidateInlineAssembly;
>
> TargetMachine *TM = TheTarget->createTargetMachine(Triple, TargetOpts.CPU,
> FeaturesStr, Options,
> @@ -552,8 +555,11 @@
> bool UsesCodeGen = (Action != Backend_EmitNothing &&
> Action != Backend_EmitBC &&
> Action != Backend_EmitLL);
> + bool ValidateInlineAssembly = (Action != Backend_EmitAssembly ||
> + Diags.getDiagnosticOptions().InlineASMSyntax);
> +
> if (!TM)
> - TM.reset(CreateTargetMachine(UsesCodeGen));
> + TM.reset(CreateTargetMachine(UsesCodeGen, ValidateInlineAssembly));
>
> if (UsesCodeGen && !TM) return;
> CreatePasses();
> Index: lib/Driver/Tools.cpp
> ===================================================================
> --- lib/Driver/Tools.cpp
> +++ lib/Driver/Tools.cpp
> @@ -2509,6 +2509,10 @@
> Args.hasArg(options::OPT_dA))
> CmdArgs.push_back("-masm-verbose");
>
> + if (Args.hasFlag(options::OPT_Winline_asm_syntax,
> + options::OPT_Wno_inline_asm_syntax, false))
> + CmdArgs.push_back("-finline-asm-syntax");
> +
> if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
> CmdArgs.push_back("-mdebug-pass");
> CmdArgs.push_back("Structure");
> Index: lib/Frontend/CompilerInvocation.cpp
> ===================================================================
> --- lib/Frontend/CompilerInvocation.cpp
> +++ lib/Frontend/CompilerInvocation.cpp
> @@ -545,6 +545,8 @@
> Args.getLastArgValue(OPT_diagnostic_serialized_file);
> Opts.IgnoreWarnings = Args.hasArg(OPT_w);
> Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
> + Opts.InlineASMSyntax = Args.hasArg(OPT_finline_asm_syntax);
> +
> Opts.Pedantic = Args.hasArg(OPT_pedantic);
> Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
> Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
> Index: test/CodeGen/inline-asm-diagnostics.c
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/inline-asm-diagnostics.c
> @@ -0,0 +1,25 @@
> +// RUN: %clang_cc1 -triple i386 -S -o - %s | FileCheck -check-prefix NO_INLINE_ASM_SYNTAX %s
> +// RUN: not %clang_cc1 -triple i386 -finline-asm-syntax -S -o /dev/null %s 2>&1 | FileCheck -check-prefix INLINE_ASM_SYNTAX %s
> +// RUN: not %clang_cc1 -emit-obj -triple i386 -o /dev/null %s 2>&1 | FileCheck -check-prefix NO_INLINE_ASM_SYNTAX_OBJ %s
> +// RUN: not %clang_cc1 -emit-obj -triple i386 -finline-asm-syntax -o /dev/null %s 2>&1 | FileCheck -check-prefix INLINE_ASM_SYNTAX_OBJ %s
> +
> +void inline_asm(void) {
> + asm volatile("invalid assembly");
> +}
> +
> +// NO_INLINE_ASM_SYNTAX: #APP
> +// NO_INLINE_ASM_SYNTAX: invalid assembly
> +// NO_INLINE_ASM_SYNTAX: #NO_APP
> +
> +// INLINE_ASM_SYNTAX: error: invalid instruction mnemonic 'invalid'
> +// INLINE_ASM_SYNTAX: asm volatile("invalid assembly");
> +// INLINE_ASM_SYNTAX: ^
> +
> +// NO_INLINE_ASM_SYNTAX_OBJ: error: invalid instruction mnemonic 'invalid'
> +// NO_INLINE_ASM_SYNTAX_OBJ: asm volatile("invalid assembly");
> +// NO_INLINE_ASM_SYNTAX_OBJ: ^
> +
> +// INLINE_ASM_SYNTAX_OBJ: error: invalid instruction mnemonic 'invalid'
> +// INLINE_ASM_SYNTAX_OBJ: asm volatile("invalid assembly");
> +// INLINE_ASM_SYNTAX_OBJ: ^
> +
> Index: test/Driver/inline-asm-syntax.cpp
> ===================================================================
> --- /dev/null
> +++ test/Driver/inline-asm-syntax.cpp
> @@ -0,0 +1,8 @@
> +// RUN: %clang -### -Winline-asm-syntax %s 2>&1 \
> +// | FileCheck -check-prefix INLINE_ASM_SYNTAX %s
> +// INLINE_ASM_SYNTAX: -finline-asm-syntax
> +
> +// RUN: %clang -### -Wno-inline-asm-syntax %s 2>&1 \
> +// | FileCheck -check-prefix NO_INLINE_ASM_SYNTAX %s
> +// NO_INLINE_ASM_SYNTAX-NOT: -finline-asm-syntax
> +
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list