Index: clang/lib/Frontend/InitPreprocessor.cpp =================================================================== --- clang/lib/Frontend/InitPreprocessor.cpp +++ clang/lib/Frontend/InitPreprocessor.cpp @@ -1317,11 +1317,10 @@ llvm::raw_string_ostream Predefines(PredefineBuffer); MacroBuilder Builder(Predefines); - // Emit line markers for various builtin sections of the file. We don't do - // this in asm preprocessor mode, because "# 4" is not a line marker directive - // in this mode. - if (!PP.getLangOpts().AsmPreprocessor) - Builder.append("# 1 \"\" 3"); + // Emit line markers for various builtin sections of the file. The 3 here + // marks as being a system header, which suppresses warnings when + // the same macro is defined multiple times. + Builder.append("# 1 \"\" 3"); // Install things like __POWERPC__, __GNUC__, etc into the macro table. if (InitOpts.UsePredefines) { @@ -1359,8 +1358,7 @@ // Add on the predefines from the driver. Wrap in a #line directive to report // that they come from the command line. - if (!PP.getLangOpts().AsmPreprocessor) - Builder.append("# 1 \"\" 1"); + Builder.append("# 1 \"\" 1"); // Process #define's and #undef's in the order they are given. for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) { @@ -1372,8 +1370,7 @@ } // Exit the command line and go back to (2 is LC_LEAVE). - if (!PP.getLangOpts().AsmPreprocessor) - Builder.append("# 1 \"\" 2"); + Builder.append("# 1 \"\" 2"); // If -imacros are specified, include them now. These are processed before // any -include directives. Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1185,8 +1185,12 @@ CurPPLexer->getConditionalStackDepth() > 0); return; case tok::numeric_constant: // # 7 GNU line marker directive. - if (getLangOpts().AsmPreprocessor) - break; // # 4 is not a preprocessor directive in .S files. + // In a .S file "# 4" may be a comment so don't treat it as a preprocessor + // directive. However do permit it in the predefines file, as we use line + // markers to mark the builtin macros as being in a system header. + if (getLangOpts().AsmPreprocessor && + SourceMgr.getFileID(SavedHash.getLocation()) != getPredefinesFileID()) + break; return HandleDigitDirective(Result); default: IdentifierInfo *II = Result.getIdentifierInfo(); Index: clang/test/Preprocessor/directives_asm.S =================================================================== --- /dev/null +++ clang/test/Preprocessor/directives_asm.S @@ -0,0 +1,25 @@ +// RUN: %clang -c %s -o /dev/null 2>&1 | FileCheck %s + +// Check that preprocessor directives are recognised as such, but lines starting +// with a # that aren't directives are instead treated as comments. + +#define MACRO .warning "This is a macro" + MACRO + +// CHECK: directives_asm.S:7:9: warning: This is a macro + +#not a preprocessing directive + +// CHECK-NOT: error: invalid preprocessing directive + +# 100 + + .warning "line number should not change" + +// CHECK: directives_asm.S:17:9: warning: line number should not change + +#line 100 + + .warning "line number should change" + +// CHECK: directives_asm.S:101:9: warning: line number should change Index: clang/test/Preprocessor/macro_redefined.S =================================================================== --- /dev/null +++ clang/test/Preprocessor/macro_redefined.S @@ -0,0 +1,10 @@ +// RUN: %clang %s -E -DCLI_MACRO=1 2>&1 | FileCheck %s + +#define CLI_MACRO +// CHECK: macro_redefined.S{{.+}}: warning: 'CLI_MACRO' macro redefined +// CHECK: {{.+}}: note: previous definition is here + +#define REGULAR_MACRO +#define REGULAR_MACRO 1 +// CHECK: macro_redefined.S{{.+}}: warning: 'REGULAR_MACRO' macro redefined +// CHECK: macro_redefined.S{{.+}}: note: previous definition is here