diff options
-rw-r--r-- | include/clang/Basic/DiagnosticParseKinds.td | 3 | ||||
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | include/clang/Basic/LangOptions.def | 3 | ||||
-rw-r--r-- | include/clang/Frontend/CodeGenOptions.h | 3 | ||||
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 4 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 3 | ||||
-rw-r--r-- | lib/Parse/ParseStmt.cpp | 18 | ||||
-rw-r--r-- | lib/Sema/SemaStmtAsm.cpp | 2 | ||||
-rw-r--r-- | test/Parser/ms-inline-asm.c | 8 |
9 files changed, 30 insertions, 17 deletions
diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index b1c16fa852..a9c0a1752c 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -18,6 +18,9 @@ def w_asm_qualifier_ignored : Warning<"ignored %0 qualifier on asm">, def warn_file_asm_volatile : Warning< "meaningless 'volatile' on asm outside function">, CatInlineAsm; +def warn_unsupported_msasm : Warning< + "MS-style inline assembly is not supported">, InGroup<Microsoft>; + let CategoryName = "Parse Issue" in { def ext_empty_translation_unit : Extension< diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index aaa022e4b3..867f75c792 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -5073,9 +5073,6 @@ let CategoryName = "Inline Assembly Issue" in { "invalid use of a cast in a inline asm context requiring an l-value: " "accepted due to -fheinous-gnu-extensions, but clang may remove support " "for this in the future">; - - def warn_unsupported_msasm : ExtWarn< - "MS-style inline assembly is not supported">, InGroup<Microsoft>; } let CategoryName = "Semantic Issue" in { diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index 3c70028ee3..acc1cf4df1 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -162,6 +162,9 @@ VALUE_LANGOPT(MSCVersion, 32, 0, LANGOPT(ApplePragmaPack, 1, 0, "Apple gcc-compatible #pragma pack handling") +BENIGN_LANGOPT(EmitMicrosoftInlineAsm , 1, 0, + "Enable emission of MS-style inline assembly.") + #undef LANGOPT #undef VALUE_LANGOPT #undef BENIGN_LANGOPT diff --git a/include/clang/Frontend/CodeGenOptions.h b/include/clang/Frontend/CodeGenOptions.h index 8610b8a89b..3b0d599577 100644 --- a/include/clang/Frontend/CodeGenOptions.h +++ b/include/clang/Frontend/CodeGenOptions.h @@ -72,8 +72,6 @@ public: unsigned EmitGcovArcs : 1; ///< Emit coverage data files, aka. GCDA. unsigned EmitGcovNotes : 1; ///< Emit coverage "notes" files, aka GCNO. unsigned EmitOpenCLArgMetadata : 1; ///< Emit OpenCL kernel arg metadata. - unsigned EmitMicrosoftInlineAsm : 1; ///< Enable emission of MS-style inline - ///< assembly. unsigned ForbidGuardVariables : 1; ///< Issue errors if C++ guard variables ///< are required. unsigned FunctionSections : 1; ///< Set when -ffunction-sections is enabled. @@ -206,7 +204,6 @@ public: EmitGcovArcs = 0; EmitGcovNotes = 0; EmitOpenCLArgMetadata = 0; - EmitMicrosoftInlineAsm = 0; ForbidGuardVariables = 0; FunctionSections = 0; HiddenWeakTemplateVTables = 0; diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 5004b4925e..e52063da74 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -1668,10 +1668,6 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { } void CodeGenFunction::EmitMSAsmStmt(const MSAsmStmt &S) { - // MS-style inline assembly is not fully supported, so sema emits a warning. - if (!CGM.getCodeGenOpts().EmitMicrosoftInlineAsm) - return; - std::vector<llvm::Value*> Args; std::vector<llvm::Type *> ArgTypes; std::string Constraints; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 95f9c38828..4f166b0e91 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1263,7 +1263,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data); Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes); Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info); - Opts.EmitMicrosoftInlineAsm = Args.hasArg(OPT_fenable_experimental_ms_inline_asm); Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file); Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir); Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file); @@ -2113,6 +2112,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.FastMath = Args.hasArg(OPT_ffast_math); Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only); + Opts.EmitMicrosoftInlineAsm = Args.hasArg(OPT_fenable_experimental_ms_inline_asm); + unsigned SSP = Args.getLastArgIntValue(OPT_stack_protector, 0, Diags); switch (SSP) { default: diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 72536fa682..37f5bc51ca 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1596,6 +1596,9 @@ StmtResult Parser::ParseReturnStatement() { /// ms-asm-line '\n' ms-asm-instruction-block /// StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) { + // MS-style inline assembly is not fully supported, so emit a warning. + Diag(AsmLoc, diag::warn_unsupported_msasm); + SourceManager &SrcMgr = PP.getSourceManager(); SourceLocation EndLoc = AsmLoc; SmallVector<Token, 4> AsmToks; @@ -1688,6 +1691,21 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) { return StmtError(); } + // If MS-style inline assembly is disabled, then build an empty asm. + if (!getLangOpts().EmitMicrosoftInlineAsm) { + Token t; + t.setKind(tok::string_literal); + t.setLiteralData("\"/*FIXME: not done*/\""); + t.clearFlag(Token::NeedsCleaning); + t.setLength(21); + ExprResult AsmString(Actions.ActOnStringLiteral(&t, 1)); + ExprVector Constraints; + ExprVector Exprs; + ExprVector Clobbers; + return Actions.ActOnAsmStmt(AsmLoc, true, true, 0, 0, 0, Constraints, Exprs, + AsmString.take(), Clobbers, EndLoc); + } + // FIXME: We should be passing source locations for better diagnostics. return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLoc, llvm::makeArrayRef(AsmToks), EndLoc); diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 6f34af2f40..dcbc21b287 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -465,8 +465,6 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, ArrayRef<Token> AsmToks, SourceLocation EndLoc) { - // MS-style inline assembly is not fully supported, so emit a warning. - Diag(AsmLoc, diag::warn_unsupported_msasm); SmallVector<StringRef,4> Clobbers; std::set<std::string> ClobberRegs; SmallVector<IdentifierInfo*, 4> Inputs; diff --git a/test/Parser/ms-inline-asm.c b/test/Parser/ms-inline-asm.c index 5326ce4d24..0e8b317e56 100644 --- a/test/Parser/ms-inline-asm.c +++ b/test/Parser/ms-inline-asm.c @@ -6,7 +6,7 @@ void t1(void) { M } // expected-warning {{MS-style inline assembly is not supported}} void t2(void) { __asm int 0x2c } // expected-warning {{MS-style inline assembly is not supported}} void t3(void) { __asm M2 0x2c } // expected-warning {{MS-style inline assembly is not supported}} -void* t4(void) { __asm mov eax, fs:[0x10] } // expected-warning {{MS-style inline assembly is not supported}} +void t4(void) { __asm mov eax, fs:[0x10] } // expected-warning {{MS-style inline assembly is not supported}} void t5() { __asm { // expected-warning {{MS-style inline assembly is not supported}} int 0x2c ; } asm comments are fun! }{ @@ -20,7 +20,7 @@ int t6() { __asm int 4 // expected-warning {{MS-style inline assembly is not supported}} return 10; } -int t7() { +void t7() { __asm { // expected-warning {{MS-style inline assembly is not supported}} push ebx mov ebx, 0x07 @@ -34,5 +34,5 @@ void t9() { __asm nop __asm nop ; __asm nop // expected-warning {{MS-style inline assembly is not supported}} } int t_fail() { // expected-note {{to match this}} - __asm - __asm { // expected-error 3 {{expected}} expected-note {{to match this}} + __asm // expected-warning {{MS-style inline assembly is not supported}} + __asm { // expected-warning {{MS-style inline assembly is not supported}} expected-error 3 {{expected}} expected-note {{to match this}} |